Entrada

NoSQLI Lab 2

NoSQLI Lab 2

Skills

  • Exploiting NoSQL operator injection to bypass authentication

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio utiliza una base de datos NoSQL en MongoDB para gestionar la funcionalidad de inicio de sesión. Es vulnerable a inyección NoSQL mediante operadores de MongoDB. Para resolver el laboratorio, debemos iniciar sesión en la aplicación como el usuario administrador. Podemos iniciar sesión en nuestra propia cuenta utilizando las credenciales wiener:peter


Resolución

Al acceder a la web vemos esto

Pulsamos sobre My account y nos logueamos con las credenciales wiener:peter

Si capturamos la petición con Burp Suite, vemos que se está enviando un JSON con el nombre de usuario y la contraseña

Si hacemos click sobre una categoría, la web nos redirige a https://0a54001f047c9ab1803bb2bf00d800cb.web-security-academy.net/filter?category=Gifts

Hay dos tipos de inyección NoSQL

  • Syntax Injection > Ocurre cuando se puede romper la sintaxis de la consulta NoSQL, lo que le permite inyectar su propia carga útil. La metodología es similar a la utilizada en la inyección SQL. Sin embargo, la naturaleza del ataque varía significativamente, ya que las bases de datos NoSQL utilizan una variedad de lenguajes de consulta, tipos de sintaxis de consulta y diferentes estructuras de datos

  • Operator Injection > Ocurre cuando puedes usar operadores de consulta NoSQL para manipular consultas

En este laboratorio vamos a explotar una Operator Injection. Las bases de datos NoSQL suelen utilizar operadores de consulta, que proporcionan formas de especificar las condiciones que deben cumplir los datos para ser incluidos en el resultado de la consulta. Podemos encontrar payloads en Hacktricks https://book.hacktricks.wiki/en/pentesting-web/nosql-injection.html y en PayloadAllTheThings https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection. También podemos usar la documentación de MongoDB https://www.mongodb.com/docs/manual/reference/operator/query/ Algunos ejemplos de operadores de consulta de MongoDB son los siguientes

  • $where -  Coincide con documentos que satisfacen una expresión de JavaScript

  • $ne - Coincide con todos los valores que no son iguales a un valor especificado

  • $in - Coincide con todos los valores especificados en una matriz

  • $nin - Coincide con documentos donde el valor de un campo no está en una lista especificada de valores

  • $regex - Selecciona documentos donde los valores coinciden con una expresión regular

  • $eq - Filtra documentos donde el valor de un campo sea igual a un valor específico

  • $gt - Coincide con documentos donde el valor de un campo es mayor que el valor especificado

  • $lt - Coincide con documentos donde el valor de un campo es menor que el valor especificado

En el contexto de bases de datos NoSQL como MongoDB, un documento es una unidad de datos almacenada, similar a un registro en bases de datos relacionales. Los documentos están estructurados en formato JSON, lo que significa que pueden contener varios campos y valores

1
2
3
4
5
6
7
8
9
10
11
12
{
  "_id": 1,
  "username": "juan123",
  "password": "mypassword123",
  "email": "juan@example.com",
  "first_name": "Juan",
  "last_name": "Pérez",
  "date_of_birth": "1994-06-15",
  "status": "active",
  "role": "user",
  "last_login": "2025-03-01T10:30:00Z"
}

Es posible que podamos inyectar operadores de consulta para manipular consultas NoSQL. Para identificar si es posible, debemos inyectar distintos operadores en los inputs y revisar las respuestas en busca de mensajes de error u otros cambios. En los inputs que se envían como un JSON, podemos insertar operadores de consulta como objetos anidados

1
{"username":"wiener"}
1
{"username":{"$ne":"invalid"}}

Para las entradas basadas en URL, podemos insertar operadores de consulta a través de parámetros de URL

1
username=wiener
1
username[$ne]=invalid

Si esto último no funciona, podemos cambiar el método de solicitud de GET a POST, cambiar el Content-Type a application/json, agregar un JSON en el body e inyectar operadores de consulta en el JSON. Podemos utilizar la extensión Content Type Converter para convertir automáticamente el método de solicitud y cambiar una solicitud codificada en URL POST a JSON

Modificamos la petición, con el operador de consulta $regex seleccionamos todos los usuarios que empiezan por adm y en el campo contraseña usamos el operador $ne con el valor null, es decir, cuya contraseña tiene un valor distinto de null

Hacemos click derecho y pulsamos Request in browser > In original session

Nos copiamos el enlace y lo pegamos en el navegador. Una vez hecho eso, habremos accedido a la cuenta del usuario administrador efectuando un login bypass

Esta entrada está licenciada bajo CC BY 4.0 por el autor.