Exploiting NoSQL operator injection to bypass authentication
Laboratorio de Portswigger sobre NoSQLI
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 Burpsuite, 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 lasintaxisde laconsulta NoSQL, lo que le permiteinyectarsu propiacarga útil. Lametodologíaes similar a la utilizada en lainyección SQL. Sin embargo, lanaturalezadel ataque varía significativamente, ya que lasbases de datos NoSQLutilizan una variedad delenguajes de consulta,tipos de sintaxis de consultay diferentesestructuras de datosOperator Injection> Ocurre cuando puedes usaroperadores de consulta NoSQLparamanipularconsultas
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 unaexpresióndeJavaScript$ne- Coincide con todos los valores queno son igualesa un valor especificado$in- Coincide con todos los valores especificados en unamatriz$nin- Coincide con documentos donde el valor de un campono estáen una lista especificada de valores$regex- Selecciona documentos donde los valores coinciden con unaexpresión regular$eq- Filtra documentos donde el valor de un campo seaiguala un valor específico$gt- Coincide con documentos donde el valor de un campo esmayor queel valor especificado$lt- Coincide con documentos donde el valor de un campo esmenor queel 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







