Respuesta rápida: sqlmap es una herramienta open source que automatiza la detección y explotación de inyecciones SQL. En su forma más simple le pasas una URL con -u, añades --dbs para listar bases de datos y -D/-T/--dump para volcar datos. Úsala solo en objetivos donde tengas permiso explícito: un programa de bug bounty en scope o un laboratorio propio.
¿Qué es sqlmap y para qué sirve?
sqlmap es el estándar de facto para automatizar inyecciones SQL. Detecta el punto inyectable, identifica el motor (MySQL, PostgreSQL, MSSQL, Oracle, SQLite…), elige la técnica que funciona (basada en booleanos, en tiempo, en errores, UNION o stacked queries) y a partir de ahí enumera y exfiltra la base de datos por ti.
No sustituye entender la vulnerabilidad. Si no sabes qué es una inyección SQL ni cómo se ve una a mano, empieza por la teoría en Academy › SQLi y vuelve aquí. sqlmap es la herramienta que te ahorra las horas mecánicas una vez que ya sabes lo que estás mirando.
Aviso ético, en serio: lanzar sqlmap contra un objetivo sin autorización es un delito. Practica solo en tus propios laboratorios o en programas de bug bounty con un scope que lo permita. En un target real, un --dump masivo puede tumbar la base de datos: mide siempre el impacto.
¿Cómo detectar una inyección con sqlmap?
El caso más común: un parámetro GET sospechoso. Le pasas la URL completa con -u:
sqlmap -u "https://target.com/product.php?id=15"
sqlmap probará el parámetro id con distintas cargas y te dirá si es inyectable y con qué técnicas. Si el sitio usa métodos POST, pásale el cuerpo con --data:
sqlmap -u "https://target.com/login" --data="user=admin&pass=1234"
Cuando la petición es compleja (cookies de sesión, cabeceras, JSON), lo más cómodo es capturarla con Burp Suite, guardarla en un fichero y pasársela con -r:
sqlmap -r peticion.txt -p id
Con -p le dices qué parámetro atacar. Si no lo especificas, sqlmap prueba todos los que encuentra (incluidas cookies y cabeceras si se lo pides).
¿Cómo enumerar bases de datos, tablas y columnas?
Una vez confirmada la inyección, se va de lo general a lo concreto. Primero, las bases de datos:
sqlmap -u "https://target.com/product.php?id=15" --dbs
Elige una con -D y lista sus tablas:
sqlmap -u "https://target.com/product.php?id=15" -D tienda --tables
Elige una tabla con -T y mira sus columnas:
sqlmap -u "https://target.com/product.php?id=15" -D tienda -T usuarios --columns
Y cuando sabes qué quieres, vuelcas los datos con --dump. Puedes acotar a columnas concretas con -C para no descargar toda la tabla:
sqlmap -u "https://target.com/product.php?id=15" -D tienda -T usuarios -C email,password --dump
Atajos útiles: --current-db (base de datos actual), --current-user (usuario de la conexión), --is-dba (¿es administrador?), --passwords (intenta extraer y crackear hashes de usuarios del motor). En un reporte de bug bounty rara vez necesitas volcar todo: basta demostrar el acceso a un dato que no deberías poder leer.
Flags esenciales del día a día
--batch: responde automáticamente a todas las preguntas con la opción por defecto. Imprescindible para no estar pulsando enter cada dos segundos.
--level (1–5): sube la exhaustividad. Niveles altos prueban más parámetros, cookies y cabeceras. Por defecto es 1.
--risk (1–3): sube la agresividad de las cargas. Riesgo 3 incluye cargas que pueden modificar datos (por ejemplo OR-based), así que ojo en producción.
--technique: fuerza técnicas concretas (B booleana, T time-based, E error-based, U union, S stacked). Útil cuando ya sabes cuál funciona y quieres ir directo.
--threads: paraleliza (hasta 10). Acelera los volcados grandes.
--random-agent: rota el User-Agent para no cantar como sqlmap.
--proxy: enruta el tráfico por Burp (--proxy=http://127.0.0.1:8080) para verlo todo.
Una combinación equilibrada para reconocimiento inicial sin pasarte de agresivo:
sqlmap -r peticion.txt -p id --level=3 --risk=2 --batch --random-agent
¿Cómo evadir un WAF con tamper scripts?
Si el objetivo tiene un firewall de aplicaciones que bloquea las cargas típicas, sqlmap incluye tamper scripts: transformaciones que ofuscan la carga (codificación, comentarios inline, cambio de mayúsculas, espacios alternativos…). Se encadenan con --tamper:
sqlmap -r peticion.txt --tamper=space2comment,between,randomcase --batch
Lista los disponibles con sqlmap --list-tampers. No hay combinación mágica: depende del WAF. Si quieres entender por qué funcionan estas transformaciones (y aplicarlas a mano cuando sqlmap falla), lo desarrollo en técnicas de WAF bypass. Para fingerprintear el WAF antes, --identify-waf te da una pista del producto.
--os-shell y explotación avanzada
Cuando el motor y los permisos lo permiten, sqlmap puede ir más allá de leer datos:
--os-shell: intenta darte una shell del sistema operativo (subiendo un stager o abusando de funciones del motor). Requiere privilegios altos y suele fallar en entornos endurecidos.
--sql-shell: una consola SQL interactiva sobre la inyección, para lanzar tus propias consultas.
--file-read / --file-write: leer o escribir ficheros del servidor si el motor lo permite (por ejemplo LOAD_FILE / INTO OUTFILE en MySQL).
Estas opciones cruzan de "leer datos" a "ejecutar en el servidor". En bug bounty, demostrar --os-shell eleva el severity a crítico, pero pide confirmación de hasta dónde puedes llegar según las reglas del programa. Ejecutar comandos en infraestructura ajena sin permiso explícito es pasarse de la raya.
¿Qué tipos de inyección detecta sqlmap?
Parte del valor de sqlmap es que prueba automáticamente cinco técnicas y elige la que funciona. Entenderlas te ayuda a leer su salida y a saber qué está pasando por debajo:
- Basada en booleanos (B). sqlmap manda condiciones verdaderas y falsas y observa si la respuesta cambia (una página distinta, un mensaje diferente). Lenta pero fiable cuando no hay salida directa.
- Basada en tiempo (T). Cuando ni siquiera cambia la respuesta, inyecta un retardo condicional (
SLEEP, WAITFOR DELAY) y mide el tiempo. Es la técnica de las inyecciones "a ciegas" (blind) totales. Muy lenta pero funciona donde nada más lo hace.
- Basada en errores (E). Si la app filtra mensajes de error de la base de datos, sqlmap fuerza errores que revelan datos en el propio mensaje. Rápida cuando está disponible.
- UNION (U). La reina cuando la consulta refleja resultados en la página: añade un
UNION SELECT para traer columnas arbitrarias. Es la que da volcados rápidos.
- Stacked queries (S). Apila consultas separadas con
;. Permite ejecutar sentencias que no son SELECT (útil para --os-shell), pero solo funciona en motores/drivers que lo permiten.
Cuando sqlmap te dice "the back-end DBMS is MySQL" y lista las técnicas que funcionan, ya sabes qué esperar: una inyección UNION o error-based irá rápida; una time-based blind puede tardar minutos en volcar una tabla. Ajusta --technique para forzar la que te interese y --threads para acelerar.
Trabajar con sesiones y peticiones complejas
En un objetivo real, la petición vulnerable casi nunca es una URL limpia. Necesitarás pasar contexto:
sqlmap -u "https://target.com/api/search" \
--cookie="session=abc123; role=user" \
--headers="Authorization: Bearer TOKEN" \
--data='{"q":"test*"}' \
--level=3 --batch
Un truco clave: el asterisco (*) marca manualmente dónde inyectar. Ponlo justo en el punto sospechoso ("q":"test*") y sqlmap ataca ahí en lugar de adivinar. Esto es esencial en cuerpos JSON, cabeceras personalizadas o rutas RESTful (/api/user/1*).
sqlmap guarda el progreso en una sesión: si cortas un volcado a medias, la próxima vez retoma donde iba en lugar de re-enumerar. Usa --flush-session para empezar limpio si algo se corrompió, y -s para apuntar a un fichero de sesión concreto. Para inyecciones de segundo orden (donde inyectas en un sitio pero el efecto sale en otro), --second-url le dice a sqlmap dónde comprobar el resultado.
Un flujo realista de principio a fin
- Encuentras un parámetro sospechoso navegando o con recon (ver técnicas de recon avanzadas).
- Capturas la petición con Burp y la guardas en
peticion.txt.
- Confirmas:
sqlmap -r peticion.txt -p id --batch --level=3 --risk=2.
- Si es inyectable, enumeras:
--dbs → -D … --tables → -T … --columns.
- Extraes solo lo justo para demostrar impacto (un email, un hash) con
--dump -C.
- Documentas la petición mínima que reproduce el fallo y escribes el reporte.
Ese último paso es el que paga. Un reporte con la petición exacta, la técnica, el motor y una prueba acotada del impacto vale mucho más que un volcado gigante sin contexto.
Errores comunes
- Confiar en sqlmap a ciegas. Si no entiendes la inyección, no sabrás distinguir un falso positivo ni escribir un buen reporte. Entrénalo primero en labs de casos reales.
- Ser demasiado agresivo en producción.
--risk=3 + --threads=10 + --dump de todo puede degradar el servicio. Mide.
- Ignorar el scope. Un parámetro fuera de scope, aunque sea vulnerable, no cuenta y puede meterte en problemas.
- No usar
--batch en automatizaciones: el proceso se queda colgado esperando input.
Preguntas frecuentes (FAQ)
¿sqlmap es legal?
La herramienta lo es; su uso depende del objetivo. Lanzarla contra un sistema sin autorización es un delito. Es legal en tus laboratorios, en máquinas de práctica y en programas de bug bounty cuyo scope y reglas lo permitan.
¿Detecta sqlmap todas las inyecciones SQL?
No. Es excelente con inyecciones "estándar" en parámetros identificables, pero puede fallar con inyecciones de segundo orden, contextos raros o filtros/WAF agresivos. Muchas inyecciones se encuentran a mano y luego se explotan con sqlmap. Por eso conviene entender la vulnerabilidad primero.
¿Por qué sqlmap dice que un parámetro no es inyectable si yo creo que sí?
Sube --level y --risk, marca el punto con *, prueba tamper scripts si hay WAF, y verifica que estás pasando bien cookies y cabeceras. A veces el problema es que la petición que envías no reproduce el estado en el que la inyección existe.
¿Es peligroso usar --dump en un objetivo real?
Puede serlo. Un volcado masivo de una tabla enorme genera mucho tráfico y carga. Acota con -C, limita filas con --start/--stop y extrae solo lo justo para demostrar impacto.
Practica antes de tocar producción
sqlmap es potente justamente porque automatiza algo que primero debes entender a mano. La ruta sana es: teoría en Academy › SQLi, práctica en labs que replican reportes reales, y solo después llevar la herramienta a un programa en scope. Cuando entiendes la inyección por dentro, sqlmap deja de ser una caja negra y se convierte en lo que es: un acelerador. Combínalo con el resto de tu arsenal siguiendo una ruta ordenada de bug bounty.