> For the complete documentation index, see [llms.txt](https://beafn28.gitbook.io/beafn28/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://beafn28.gitbook.io/beafn28/web-security/laboratorios-portswigger/nosql-injection.md).

# NoSQL injection

## Lab: Detecting NoSQL injection

### Enunciado

El filtro de categorías de productos de este laboratorio está respaldado por una base de datos NoSQL MongoDB. Es vulnerable a inyección NoSQL. Realiza un ataque de inyección NoSQL que haga que la aplicación muestre productos no publicados.

### Resolución

Vemos si es vulnerable poniendo una comilla simple.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FAG5qBwbmIoPjTE0QOY0I%2Fimage.png?alt=media&amp;token=63b0e7a2-a313-4942-aee8-ceb49f5aecc8" alt=""><figcaption></figcaption></figure>

Al ser vulnerable realizamos la inyección típica en SQL pero en NoSQL.

```
category=Gifts%27%20||1||%27
```

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FyzK4pBfUSl008frK7Ypz%2Fimage.png?alt=media&amp;token=3dc296f9-c275-4270-9169-06acc424a81c" alt=""><figcaption></figcaption></figure>

## Lab: Exploiting NoSQL operator injection to bypass authentication

### Enunciado

La funcionalidad de inicio de sesión de este laboratorio está respaldada por una base de datos NoSQL MongoDB. Es vulnerable a inyección NoSQL mediante el uso de operadores de MongoDB. Inicia sesión en la aplicación como el usuario administrador.

Puedes iniciar sesión en tu propia cuenta con las siguientes credenciales:

* **Usuario:** `wiener`
* **Contraseña:** `peter`

### Resolución

Nos logueamos y vemos la petición.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2F6jLYDeasVcFvyPRlPf3h%2Fimage.png?alt=media&amp;token=036425c8-7078-4b4f-9f5d-173528a45be6" alt=""><figcaption></figcaption></figure>

Podemos intentar inyectar objetos en los campos de usuario y contraseña para probar inyecciones NoSQL.

```
{"username":{"$gt":""},"password":{"$gt":""}}
```

Bueno, eso es interesante: código de respuesta 500 y un error que indica que se devolvió un número inesperado de registros.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FcCvevGDczrCZovIPwYHl%2Fimage.png?alt=media&amp;token=4f412475-9ce2-480c-9c8e-0e3193446203" alt=""><figcaption></figcaption></figure>

La consulta que enviamos en realidad terminaría recuperando todos los registros de la base de datos. Y la base de datos tendría más de un registro, pero el código del backend esperaría que la consulta devolviera solo un registro. Vamos a evadir la autenticación aprovechando la inyección **NoSQL** que encontramos en la funcionalidad de inicio de sesión:

```
{"username":{"$regex":"^admin"},"password":{"$gt":""}}
```

Observa que obtuvimos un **código de respuesta 302** y no un 500.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FBqTC3BRuiVT0VTTjwK9P%2Fimage.png?alt=media&amp;token=5778ce49-2c40-441e-a2ee-ff461a9f64e3" alt=""><figcaption></figcaption></figure>

Interceptamos con **Proxy** y con esa inyección damos a **Forward**.

<figure><img src="https://469389308-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FbKXfRjFOYJgGlV1An6Cf%2Fuploads%2FNLqkf9gwEI6qnLFDQi5x%2Fimage.png?alt=media&amp;token=41663f0f-76dd-4a50-9989-28618294c335" alt=""><figcaption></figcaption></figure>
