Vulnerabilidad NoSQL injection
www.onlinetis.com
La NoSQL injection es una vulnerabilidad de seguridad que se produce cuando una aplicación no sanitiza correctamente la entrada del usuario antes de utilizarla para construir y ejecutar consultas en una base de datos NoSQL. Al igual que la SQL injection, esta vulnerabilidad permite a un atacante inyectar código malicioso en la consulta, alterando su lógica o extrayendo datos sensibles.
¿Cómo funciona?
A diferencia de las bases de datos relacionales que utilizan SQL, las bases de datos NoSQL (como MongoDB, CouchDB o Cassandra) no tienen un lenguaje de consulta estandarizado. Sus consultas se construyen a menudo con lenguajes de programación o con objetos JSON.
Un ataque de inyección NoSQL se aprovecha de esta flexibilidad. Por ejemplo, en una aplicación que utiliza MongoDB, una consulta de autenticación podría lucir así en el código:
// La variable "password" viene de la entrada del usuario
const query = {
username: req.body.username,
password: req.body.password
};
db.collection('users').findOne(query, (err, user) => { ... });
Si un atacante introduce una entrada maliciosa como {"$ne": null}
en el campo de la contraseña, el objeto query
se convierte en:
{
"username": "attacker",
"password": { "$ne": null }
}
La consulta resultante buscará un usuario con el nombre de "attacker" y cuya contraseña no sea igual a null. Si el atacante no sabe la contraseña, esta condición siempre será verdadera, permitiéndole el acceso sin credenciales correctas.
Tipos de ataques y su impacto
Autenticación y omisión de acceso: Es el ataque más común. Al manipular la lógica de la consulta de autenticación, un atacante puede saltarse la página de inicio de sesión y acceder al sistema.
Enumeración de datos: Un atacante puede utilizar operadores especiales de NoSQL (como
$regex
) y técnicas de timing para enumerar datos en la base de datos, adivinando información campo por campo.Ejecución de código arbitrario: Algunas bases de datos NoSQL (como MongoDB) permiten ejecutar código JavaScript en el lado del servidor. Si un atacante puede inyectar código JS malicioso, podría lograr la ejecución de código remoto.
Cómo prevenirla
La prevención de la NoSQL injection se basa en la misma premisa que la SQL injection: nunca confíes en la entrada del usuario.
Sanitizar y validar la entrada: Siempre valida la entrada del usuario. Utiliza un esquema de validación estricto para asegurarte de que los datos recibidos son del tipo esperado.
Evitar la concatenación de strings: No construyas consultas NoSQL concatenando strings con la entrada del usuario. En su lugar, usa APIs o funciones de driver que ofrezcan un mapeo de objeto a documento seguro, ya que estas funciones escapan o validan los caracteres maliciosos de forma predeterminada.
Principio del menor privilegio: Configura la base de datos con un usuario que tenga los mínimos privilegios necesarios para la aplicación.
Actualizar el software: Mantén el motor de base de datos y sus controladores (drivers) siempre actualizados, ya que las nuevas versiones a menudo incluyen mejoras de seguridad para mitigar estas vulnerabilidades.