Explotación de vulnerabilidades de inyección SQL en Nmap

Beginner

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá sobre la inyección SQL, una técnica utilizada por los atacantes para explotar vulnerabilidades en aplicaciones web que interactúan con bases de datos. Los ataques de inyección SQL pueden permitir el acceso no autorizado a datos sensibles, la manipulación de datos e incluso la compromisión total del sistema.

El objetivo de este laboratorio es adquirir experiencia práctica con la inyección SQL mediante la explotación de vulnerabilidades en una aplicación web vulnerable. Aprenderá cómo identificar posibles vulnerabilidades de inyección SQL, crear consultas SQL maliciosas y extraer información sensible de la base de datos. Además, aprenderá sobre mecanismos de defensa y mejores prácticas para mitigar los ataques de inyección SQL.


Skills Graph

Configurar el entorno de laboratorio

En este paso, configurará el entorno de laboratorio, que incluye una aplicación web vulnerable y un servidor de base de datos.

  1. Abra la terminal y navegue hasta el directorio /home/labex/project.

    cd /home/labex/project
  2. Hay dos archivos de Python en el directorio project: app.py y setup_db.py. El archivo app.py contiene el código fuente de la aplicación web vulnerable, y el archivo setup_db.py contiene el código para configurar la base de datos.

  3. Ejecute el script setup_db.py para crear la base de datos y llenarla con datos de muestra.

    python3 setup_db.py
  4. Inicie el servidor de la aplicación web.

    python3 app.py

Debería ver un mensaje que indique que el servidor está funcionando en http://localhost:5000.

Identificar vulnerabilidades de inyección SQL

En este paso, aprenderá cómo identificar posibles vulnerabilidades de inyección SQL en la aplicación web.

  1. Abra un navegador web y navegue a http://localhost:5000.
    Página de inicio de la aplicación web
  2. Busque campos de entrada donde se envíen datos del usuario al servidor, como cuadros de búsqueda.
  3. Intente ingresar caracteres especiales o palabras clave SQL (por ejemplo, ', ", --, ;) en los campos de entrada y observe el comportamiento de la aplicación.
  4. Si la aplicación muestra mensajes de error o se comporta inesperadamente, puede indicar una posible vulnerabilidad de inyección SQL.
    Prueba de entrada en el cuadro de búsqueda
    Cuando ingresa una comilla simple (') en el cuadro de búsqueda y hace clic en el botón "Buscar", la aplicación solo muestra No results found sin ningún mensaje de error. Este comportamiento sugiere que la aplicación puede ser vulnerable a la inyección SQL.

Explotar vulnerabilidades de inyección SQL

En este paso, aprenderá cómo explotar las vulnerabilidades de inyección SQL identificadas para extraer información sensible de la base de datos.

  1. Localice el campo de entrada o parámetro vulnerable identificado en el paso anterior.

  2. Intente insertar diferentes cargas útiles (payloads) de inyección SQL en el campo de entrada o parámetro.

  3. Intente extraer información sensible de la base de datos utilizando cargas útiles de inyección SQL. Por ejemplo, puede utilizar la siguiente carga útil para extraer datos de la base de datos:

    ' UNION SELECT username, password FROM users --

    La carga útil anterior se puede utilizar para recuperar los nombres de usuario y contraseñas de la tabla users en la base de datos.

  4. Observe la respuesta de la aplicación y busque cualquier información sensible que se muestre o errores que puedan revelar información sobre la estructura o el contenido de la base de datos.

Mitigar vulnerabilidades de inyección SQL

En este paso, aprenderá sobre mecanismos de defensa y mejores prácticas para mitigar las vulnerabilidades de inyección SQL.

  1. Revise el código fuente de la aplicación web vulnerable e identifique las áreas donde se utiliza la entrada del usuario en consultas de base de datos sin una adecuada sanitización.

  2. Implemente técnicas de validación y sanitización de entrada, como:

    • Consultas parametrizadas o sentencias preparadas
    • Validación y sanitización de entrada (por ejemplo, eliminar o escapar caracteres especiales)
    • Principio de menor privilegio para las cuentas de base de datos
  3. Actualice el código de la aplicación para utilizar consultas parametrizadas o sentencias preparadas al ejecutar consultas de base de datos con entrada del usuario.
    Modifique el archivo app.py de:

    sql_query = "SELECT username, password FROM users WHERE username LIKE '%{}%' OR '{}'".format(query, query)
    cur.execute(sql_query)

    a:

    sql_query = "SELECT username, password FROM users WHERE username LIKE?"
    cur.execute(sql_query, ('%' + query + '%',))

    Y mueva results = cur.fetchall() debajo de la línea logging.info(f"Search query: {query}").

    logging.info(f"Search query: {query}")
    
    results = cur.fetchall()
  4. Después de los cambios anteriores, guarde el archivo y reinicie el servidor de la aplicación web.

    Use ctrl+c para detener el servidor y luego reinícielo usando:

    python3 app.py
  5. Pruebe la aplicación actualizada para asegurarse de que los ataques de inyección SQL ya no son posibles.

Resumen

En este laboratorio, aprendiste sobre la inyección SQL, una técnica utilizada por los atacantes para explotar vulnerabilidades en aplicaciones web que interactúan con bases de datos. Configuraste una aplicación web vulnerable y un servidor de base de datos, identificaste posibles vulnerabilidades de inyección SQL y las explotaste para extraer información sensible de la base de datos. Además, aprendiste sobre mecanismos de defensa y mejores prácticas para mitigar los ataques de inyección SQL, como la validación de entrada, la sanitización y el uso de consultas parametrizadas o sentencias preparadas.

A través de esta experiencia práctica, adquiriste una comprensión más profunda de los ataques de inyección SQL y cómo prevenirlos en aplicaciones web. También aprendiste la importancia de las prácticas de codificación segura y las posibles consecuencias de no sanitizar adecuadamente la entrada del usuario al interactuar con bases de datos.