Inyecciones NoSQL; Explicación y PoC

        Las inyecciones NoSQL representan una amenaza significativa para la seguridad de las aplicaciones web que dependen de bases de datos NoSQL como MongoDB, Cassandra y CouchDB. Estas vulnerabilidades ocurren cuando los atacantes pueden introducir datos maliciosos en consultas de bases de datos, que luego son ejecutadas sin la debida validación o sanitización por parte de la aplicación.

    Al igual que las inyecciones SQL, las inyecciones NoSQL explotan vulnerabilidades específicas de las bases de datos NoSQL. Sin embargo, su enfoque difiere al aprovechar consultas basadas en documentos en lugar de tablas relacionales. En una inyección NoSQL, los atacantes pueden manipular consultas de base de datos para obtener información confidencial o realizar acciones no autorizadas.

    La falta de validación de datos en consultas a bases de datos NoSQL permite a los atacantes realizar estas manipulaciones. A diferencia de las inyecciones SQL, que se dirigen a bases de datos relacionales, las inyecciones NoSQL explotan la falta de validación en consultas a bases de datos NoSQL. Esta falta de validación significa que los atacantes pueden ejecutar consultas de manera no autorizada y acceder a datos sensibles sin restricciones.

    Para mitigar las vulnerabilidades de inyección NoSQL y proteger las aplicaciones web contra posibles ataques, es crucial implementar las siguientes prácticas de seguridad:

        •  Validación de entrada de datos: Validar cuidadosamente todos los datos ingresados por el usuario antes de procesarlos en consultas de base de datos. Esto puede incluir la verificación de tipos de datos, longitud y caracteres permitidos, así como la implementación de listas blancas (whitelists) para permitir solo entradas válidas.

         •  Parámetros parametrizados o consultas preparadas: Utilizar parámetros parametrizados o consultas preparadas proporcionados por los marcos ORM (Mapeo Objeto-Relacional) o bibliotecas de acceso a datos. Estas técnicas aseguran que los datos proporcionados por el usuario se transmitan de manera segura a la base de datos, evitando así la ejecución no deseada de código malicioso.

         • Escapado de caracteres especiales: Escape de manera adecuada los caracteres especiales que podrían ser utilizados para realizar ataques de inyección. Esto implica convertir estos caracteres en su equivalente seguro para la base de datos antes de incluirlos en consultas.

        •Aplicación del principio de menor privilegio: Limitar los privilegios de acceso de la aplicación a la base de datos. Específicamente, asegúrese de que la aplicación solo tenga acceso a las operaciones y datos necesarios para su funcionamiento, reduciendo así el impacto de posibles ataques.

        •Actualizaciones y parches regulares: Mantener actualizados todos los sistemas y bibliotecas utilizados en el desarrollo de la aplicación, incluyendo el sistema operativo, el servidor web, la base de datos y cualquier software de terceros. Las actualizaciones y parches suelen incluir correcciones de seguridad que pueden mitigar vulnerabilidades conocidas.

         • Monitorización y registro de actividades: Implementar sistemas de monitorización y registro de actividades para detectar y registrar posibles intentos de ataque. Esto permite una respuesta rápida ante posibles incidentes de seguridad y facilita la identificación de patrones de actividad maliciosa.

         • Auditorías de seguridad regulares: Realizar auditorías de seguridad periódicas para evaluar la robustez de las medidas de seguridad implementadas y detectar posibles vulnerabilidades. Estas auditorías pueden ser realizadas internamente por el equipo de desarrollo o mediante la contratación de servicios externos de seguridad informática.

    Al implementar estas prácticas de seguridad, se pueden reducir significativamente el riesgo de ataques de inyección NoSQL y proteger sus aplicaciones web contra posibles brechas de seguridad.



PoC

    Nos encontramos frente a un dashboard de una maquina vulnerable la cual contempla Mongo como base de datos


    Vamos a intentar iniciar sesión en el panel de login con usuarios y contraseñas por defecto;


    Nos identifica la estructura por la cual se procesan los datos, vamos a capturar la petición con burpsuite;


Vemos que nos indica que el usurario o la contarseña son invalidos, tras aplicar numerosas inyecciones sql vamos a aplicar inyecciones NoSQL.

    En este caso vamos a filtrar por el usuario "admin" y le vamos a indicar en el campo "password" mediante el operador "$ne" que la contraseña no es igual a admin;

    Como vemos nos hemos conseguido loguear, si vamos un poco mas allá,  en este caso vamos a utilizar el operador "$ne" en ambos casos para que diga que el usuario no es igual a "CuriosidadesDeHackers" y que la contraseña no es igual a "admin";


    Conseguimos logearnos como administradores.

    De la misma manera lo podemos hacer con el operador "$regex"(El operador $regex se utiliza para realizar coincidencias basadas en expresiones regulares en MongoDB) y con el operador "$ne".

    Le indicamos que estamos buscando "documentos" donde el campo "username" mediante una expresión regular que comience con la letra "a" gracias al acento circunflejo. Y de la misma manera con el operador "$ne" le indicamos que la contraseña no sea igual a "admin".

    Nuevamente nos logeamos somo administradores, en caso de que hubiera mas usuarios podríamos jugar con el operador "$regex" variando la letra

    En el panel de busqueda si indicamos el usuario no nos da informacion;


    Pero al cambiar la petición a POST y la estructura a JSON nos vuelca información confidencial;


    En el mismo panel de búsqueda podemos utilizar cadenas, este caso jugaremos con la cadena "admin' || '' == '1", donde `'1' == '1' siempre es verdadero y al utilizar el operador o tuberías "||" (OR) la condición será siempre verdadera para "admin", como vemos nos vuelca información la cual no deberíamos de estar viendo;



PoC 2

     
    En este otro escenario nos encontramos nuevamente frente a un panel de login;



    Vamos a logeranos capturando la peticion con burpsuite, vemos que "nanai de la china limonera";


    Vamos a utilizar los operadores "$ne" nuevamente, sin embargo, obtenemos un "302 Found", que se corresponde con una respuesta positiva de la base de datos; 


    Vamos a utilizar un script de PayloadsAllTheThings para conseguir extraer usuarios y contraseñas;


    Este script es un ejemplo de un ataque de inyección basado en MongoDB;

        1. Importa las bibliotecas necesarias, como "requests", "urllib3", "string", "re" y "time".
        2. Desactiva las advertencias de "urllib3"para evitar mensajes molestos.
        3. Define algunas variables importantes, como "username" y "password".
        4. Define la URL del objetivo "u" y establece los encabezados HTTP.
        5. Inicia un bucle infinito ("while True:") para realizar el ataque de manera continua.
        6. Itera a través de todos los caracteres imprimibles ("string.printable") y construye un payload para la solicitud POST. Este payload se inyecta en el campo "username" y contiene una expresión regular ("$regex") que coincide con la cadena "username" más un carácter ("c") de "string.printable".
        7. Realiza una solicitud POST al objetivo con el payload construido.
        8. Verifica si la respuesta tiene un código de estado 302 (Redirección encontrada). Esto puede indicar que se ha encontrado un usuario válido.
        9. Si se encuentra una redirección, imprime el carácter encontrado y lo agrega al "username".
        10. El bucle continúa hasta que se encuentran todos los caracteres del "username".

Utilizaremos "$regex" para filtrar por usuarios y nos muestres las coincidencias, como vemos, obtenemos el usuario "admin";


    De la misma manera, al indicar en la variable "username="m" le estamos indicando que comience por la letra "m" y nos itere todos los caracteres validos restantes;




    Una vez tenemos los usuarios, podemos modificar el script para que utilice el operador "$regex" en el campo de "password" utilizando como variable "username" los usuarios que hemos encontrado;


    Al ejecutarlo nos va mostrando los caracteres validos para el usuario "admin";


    Y de la misma manera para el usuario "mango";




No hay comentarios:

Publicar un comentario