La herramienta SQLMap puede encontrarse en la caja de herramientas de cualquier probador de penetración. Es una de las herramientas más populares y poderosas cuando se trata de explotar la vulnerabilidad de inyección SQL, que a su vez encabeza la lista OWASP de las 10 principales vulnerabilidades. Desde la confirmación de la vulnerabilidad de inyección SQL hasta la extracción del nombre de la base de datos, tablas, columnas y la obtención de un sistema completo, se puede utilizar para múltiples propósitos.
En este artículo, vamos a ver diferentes tipos de comandos SQLMap que pueden ser útiles mientras se explotan diferentes escenarios de inyección SQL.
SQLMap se puede descargar desde los siguientes enlaces:
Windows
Linux: git clone -depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
Para fines de demostración, estoy usando esta máquina de Vulnhub.
Veamos el uso básico de la herramienta SQLMap en peticiones GET y POST.
sqlmap -u http://site-to-test.com/test.php?id=1 -p id
sqlmap -u http://site-to-test.com/test.php?id=1*
-u: URL a escanear
-p: parámetro a escanear
*: Parámetro a escanear (si no se proporciona el modificador -p)
Solicitud POST
Podemos proporcionar los datos que se pasan en el cuerpo de la solicitud POST para que los escanee la herramienta SQLMap.
sqlmap -u http://site-to-test.com/admin/index.php -data=»user=admin&password=admin» -p user
-data = POST data
Otra forma es copiar la petición Burp en un fichero y pasarla a SQLMap.
sqlmap -r <ruta al fichero de peticiones>
Avancemos un poco para entender otras opciones que ofrece la herramienta SQLMap.
Escanear páginas de inicio de sesión POST
Las páginas de inicio de sesión post están autorizadas por la cabecera cookie, que se pasa en la cabecera HTTP de una petición GET/POST. Para escanear la(s) página(s) de inicio de sesión, tenemos que proporcionar la cookie válida a SQLMap.
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -cookie=»valor de la cookie»
/admin/index.php?id=1 es una página de inicio de sesión.
De forma similar, muchas de las páginas están protegidas por la cabecera User-Agent o Referrer. Lo mismo puede incluirse en el comando:
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -user-agent=infosec
sqlmap -u http://192.168.202.163/admin/index.php?id=1 -referer= http://192.168.202.163/admin/index.php
Además, podemos aleatorizar la cabecera user-agent utilizando la opción -random-agent.
CRAWL
Crawl es una opción importante que permite a la herramienta SQLMap rastrear el sitio web, empezando por la ubicación raíz. La profundidad a rastrear se puede definir en el comando.
sqlmap -u http://192.168.202.160/ -crawl=1
-crawl: Define una profundidad para rastrear. (Ejemplo: Definir 2 permitirá a la herramienta rastrear hasta dos directorios)
Si queremos excluir alguna página del alcance del crawler podemos definir mediante -crawl-exclude. Esta es una opción útil cuando estamos rastreando una página de inicio de sesión.
sqlmap -u http://192.168.202.163/ -crawl=3 -cookie=»valor de la cookie» -crawl-exclude=»logout»
Este comando rastreará el sitio web hasta tres directorios y excluirá cualquier URL donde esté presente la palabra clave «logout».
Como puede ver a continuación, SQLMap ha rastreado el sitio web pero ha excluido la URL de cierre de sesión.
Ejecutamos el mismo comando sin la opción -crawl-exclude:
Como se ve a continuación, cuando no se define -crawl-exclude, SQLMap ha rastreado la URL de cierre de sesión. Esto permitiría invalidar la sesión existente (debido al cierre de sesión) y no completar el rastreo.
SQLMap a través de Proxy
Podemos definir los detalles de un proxy desde donde permitimos que pase la petición. Si queremos pasar la petición a través de una herramienta proxy como Burp, inicie Burp Suite y configúrelo para que se ejecute en localhost en el puerto 8080. Ahora utiliza el siguiente comando SQLMap:
sqlmap -u http://192.168.202.162/cat.php?id=1 -p id -proxy=»http://localhost:8080″
Ahora, piensa en un escenario donde las palabras clave de sqlinjection como OrderBy y Union están en la lista negra del servidor. Podemos evitar este tipo de implementaciones utilizando la técnica de camel casing. Utilizaremos SQLMap para enviar el tráfico a Burp y utilizaremos la función «match and replace» de Burp para saltarnos la restricción anterior.
La función Match and Replace se encuentra en la pestaña «Options», bajo la pestaña «Proxy» de Burp.
Esta comprobará si la petición tiene una palabra clave como «union». Si la respuesta es afirmativa, se sustituye por «UnIoN».
En un escenario en el que la aplicación es accesible sólo a través de un servidor proxy, se puede definir el mismo utilizando el siguiente comando:
sqlmap -u http://192.168.202.162/cat.php?id=1 -p id -proxy=»http://localhost:8080″ -proxy-cred=username:password
Batch
El comando batch se utiliza para sesiones no interactivas. Cuando intentamos escanear algo, SQLMap puede pedirnos que proporcionemos información durante el escaneo: por ejemplo, mientras se utiliza la función de rastreo, la herramienta pregunta al usuario si quiere escanear la URL identificada. Cuando se define -batch en el comando, la herramienta utiliza un valor por defecto para proceder sin preguntar al usuario.
Form
Se puede proporcionar la URL de una página con un campo de formulario (por ejemplo, la página de inicio de sesión) junto con la opción -form para analizar la página y guiar al usuario para probar los campos identificados.
Ahora las páginas con un gran número de campos de formulario pueden ser probadas efectivamente usando la opción -form y -batch juntas. Esto analizará la página y comprobará los campos de formulario y proporcionará automáticamente la entrada en nombre del usuario.
Si toda la aplicación tiene que ser escaneada, la opción de rastreo junto con la opción -form y -batch puede ser utilizada.
Hilos
La opción de hilos permite al usuario definir el número de solicitudes concurrentes que serán enviadas por la herramienta SQLMap. Esto reduciría el tiempo total de las pruebas. Esto no debe mantenerse en un valor más alto, ya que puede afectar a la precisión del resultado.
Riesgo y Nivel
El riesgo permite el tipo de cargas útiles utilizadas por la herramienta. Por defecto, utiliza el valor 1 y se puede configurar hasta el nivel 3. El nivel 3, al ser el máximo, incluye algunas consultas SQL pesadas.
El nivel define el número de comprobaciones/cargas útiles a realizar. El valor va de 1 a 5. 5, siendo el máximo, incluye un gran número de payloads en el escaneo.
Se recomienda aumentar el riesgo y el nivel si SQLMap no es capaz de detectar la inyección en la configuración por defecto.
Verbose
En caso de que queramos ver el payload que está enviando la herramienta, podemos utilizar la opción verbose. Los valores van de 1 a 6.
Enumeración de la base de datos
Como sabemos que SQLMap se utiliza principalmente para la explotación de inyecciones SQL, veamos algunos de los comandos para enumerar la base de datos a través de una aplicación vulnerable a la inyección SQL.
1. -dbs: Esta opción se utiliza para enumerar la base de datos.
2. Ahora tenemos el nombre de la base de datos. Para extraer la tabla de la base de datos «photoblog», ejecuta el siguiente comando:
3. Para extraer los detalles de las columnas de la tabla «usuarios», ejecute el siguiente comando:
4. Para volcar los datos de la tabla «usuarios», utilice el comando -dump:
5. Para identificar el usuario actual de la base de datos:
6. Para identificar el nombre actual de la base de datos:
7. Identificar los privilegios, roles y si el usuario actual de la base de datos es el administrador de la base de datos:
Saltar el WAF usando el Tamper Script
Muchas veces, nos encontramos con un escenario en el que la aplicación se mantiene detrás del firewall de aplicaciones web (WAF). Para comprobar si el sitio está protegido por WAF, podemos utilizar las siguientes opciones:
-identificar-waf
Una vez identificado el WAF, podemos utilizar el script de manipulación para atacar las aplicaciones protegidas por WAF. El script de manipulación puede modificar la solicitud para escapar de la detección del WAF. Los scripts se encuentran en el directorio /usr/share/sqlmap/tamper/.
Ejecución de comandos de sistema
Podemos ejecutar los comandos de nivel de sistema/sistema si el usuario actual de la base de datos tiene derechos de DBA. Podemos utilizar las siguientes opciones:
Para un servidor Linux:
sqlmap -u http://192.168.202.162/cat.php?id=1 -os-shell
Para un servidor Windows:
sqlmap -u http://192.168.202.162/cat.php?id=1 -os-cmd <cmd>
Ejecución de consultas SQL
Podemos ejecutar la sentencia SQL en la base de datos ejecutando los siguientes comandos:
sqlmap -u 192.168.202.164/cat.php?id=2 -sql-shell
Otras opciones
Algunas otras opciones incluyen:
1. Escanear una página protegida por autenticación HTTP como Basic, NTLM y Digest:
sqlmap -u http://example.com/admin.aspx -auth-type Basic -auth-cred «admin:admin»
2. Escanear una página protegida por una autenticación basada en clave
sqlmap -u http://example.com/admin.aspx -auth-file=<ruta al certificado PEM o archivo de clave privada>
3. Para aleatorizar las IPs atacantes (esto puede ayudar en casos como la detección de WAF, o cuando ocultar el origen del ataque aumentaría la dificultad de rastrear la IP).
Para usar la red anónima Tor por defecto:
sqlmap -u http://example.com/admin.aspx -tor
Para definir un puerto Tor:
sqlmap -u http://example.com/admin.aspx -tor-port=<tor proxy port>
4. Si se requiere un retraso entre cada petición HTTP:
sqlmap -u http://example.com/admin.aspx -delay=1 #1 segundo de retraso
5. Si una página está protegida por un token CSRF, podemos incluir el mismo en el comando:
sqlmap -u http://example.com/admin.aspx -csrf-token=<csrf token>
Inyección SQL de segundo orden: En este tipo de inyección SQL, la carga útil SQL se almacena en la base de datos y se recupera posteriormente al acceder a una página diferente. Proporcionamos una URL, que será solicitada por la herramienta SQLMap después de cada inyección. Podemos ordenar a la herramienta SQLMap que pruebe esta inyección utilizando los siguientes comandos:
sqlmap -r /root/Desktop/Burp.txt -second-order «http://target/vulnerbalepage.php»
El archivo Burp.txt contiene la petición en la que se va a realizar la inyección.
el segundo orden «URL» contiene la URL a la que accederá SQLMap después de cada inyección.