Parte: 4 — Seguridad de aplicaciones web · Fuente: OWASP WSTG / Bug Bounty Bootcamp (Vickie Li) ⏱️ Duración estimada: 90 min · Nivel: Intermedio
Entender que la inyección no es exclusiva de SQL: las bases NoSQL (MongoDB, etc.) tienen sus propios vectores. Aprenderás a explotar operadores de MongoDB y JavaScript del lado servidor para saltar autenticación y extraer datos.
⚠️ Ética: solo en laboratorios propios o autorizados. Estas técnicas modifican y exfiltran datos reales.
Al finalizar, el alumno podrá:
$ne, $gt, $regex, $where) como payloads.$regex.| # | Tema | Por qué importa |
|---|---|---|
| 1 | Modelo de datos NoSQL | Cambia la forma del ataque |
| 2 | Operadores de consulta MongoDB | Los payloads son operadores |
| 3 | Inyección vía JSON vs. query string | El formato altera el vector |
| 4 | Auth bypass con $ne/$gt |
Impacto directo |
| 5 | Blind NoSQLi con $regex |
Extracción carácter a carácter |
| 6 | $where y JS server-side |
Ejecución de lógica arbitraria |
| 7 | Defensa: validar tipos | Cierre del fallo |
$ne: "not equal". Característica: {"$ne": null} casi siempre es verdadero, ideal para bypass.$regex: coincidencia por expresión regular. Característica: permite inferir datos carácter a carácter (blind).$where: ejecuta JavaScript en el servidor Mongo. Característica: potente y peligroso; puede permitir DoS o extracción.{"$ne":""} donde se espera un string. Característica: posible cuando el backend no valida tipos.# NodeGoat como lab NoSQL en Node/Mongo
git clone https://github.com/OWASP/NodeGoat && cd NodeGoat && docker compose up
⚠️ Solo en tu laboratorio.
{"username":"x","password":"y"}).{"username":"admin","password":{"$ne":""}}
username[$ne]=&password[$ne]=.$regex para adivinar la contraseña:{"username":"admin","password":{"$regex":"^a"}}
^a, ^ab, ...) según la respuesta de login para reconstruir el valor.$where, prueba una condición JS y evalúa el riesgo (sin causar DoS).$regex blind.{"$gt":""} también funciona como bypass.typeof === 'string').$where y por qué está desaconsejado.Consigue un bypass de autenticación en un lab NoSQL (NodeGoat/Juice Shop) y luego extrae parcialmente una credencial con NoSQLi ciega por $regex.
Criterio de aceptación: demuestras el login sin conocer la contraseña y recuperas al menos los primeros caracteres del valor real mediante $regex, documentando los payloads.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| El operador no se interpreta | El backend recibe string, no objeto; ajusta Content-Type/formato |
$where bloqueado |
Deshabilitado en el servidor; usa otros operadores |
| Regex demasiado lento | Usa anclas ^ y búsqueda incremental |
| Bypass no funciona en query string | La app parsea distinto; prueba notación param[$ne] |
| Falsos positivos | Confirma con dos operadores distintos |
❓ ¿Por qué el JSON facilita NoSQLi? Porque un campo que debería ser string puede convertirse en un objeto con operadores si el servidor no valida el tipo.
❓ ¿MongoDB es inseguro por diseño? No; el problema es el código que pasa input sin validar tipos ni sanitizar. Con validación estricta no hay NoSQLi.
❓ ¿Sirve sqlmap para NoSQL? No. Para NoSQL existe NoSQLMap y payloads manuales; los conceptos son análogos pero la sintaxis difiere.