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 lasintaxis
de laconsulta NoSQL
, lo que le permiteinyectar
su propiacarga útil
. Lametodología
es similar a la utilizada en lainyección SQL
. Sin embargo, lanaturaleza
del ataque varía significativamente, ya que lasbases de datos NoSQL
utilizan una variedad delenguajes de consulta
,tipos de sintaxis de consulta
y diferentesestructuras de datos
Operator Injection
> Ocurre cuando puedes usaroperadores de consulta NoSQL
paramanipular
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 unaexpresión
deJavaScript
$ne
- Coincide con todos los valores queno son iguales
a 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 seaigual
a un valor específico$gt
- Coincide con documentos donde el valor de un campo esmayor que
el valor especificado$lt
- Coincide con documentos donde el valor de un campo esmenor 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