Tutorial de sqlmap en español paso a paso: detectar y explotar inyecciones SQL con -u, listar bases de datos con --dbs, volcar tablas con -D/-T/--dump, automatizar con --batch, ajustar --level/--risk, evadir WAF con tamper scripts y llegar a --os-shell. Siempre dentro de un scope autorizado.
Gorka El Bochi
Fundador de BBLABS
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--dbspara listar bases de datos y-D/-T/--dumppara volcar datos. Úsala solo en objetivos donde tengas permiso explícito: un programa de bug bounty en scope o un laboratorio propio.
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.
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).
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.
--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
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.
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.
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:
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.UNION SELECT para traer columnas arbitrarias. Es la que da volcados rápidos.;. 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.
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.
peticion.txt.sqlmap -r peticion.txt -p id --batch --level=3 --risk=2.--dbs → -D … --tables → -T … --columns.--dump -C.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.
--risk=3 + --threads=10 + --dump de todo puede degradar el servicio. Mide.--batch en automatizaciones: el proceso se queda colgado esperando input.¿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.
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.
hunters entrenando
labs de reportes reales
completaciones
en bounties practicados
Crea tu cuenta gratis y practica sobre labs basados en reportes reales que pagaron miles de euros. La Academy es gratis para siempre.
Sin tarjeta · Academy gratis · cancela cuando quieras
Todo lo que necesitas para montar un entorno profesional de bug bounty: desde la elección del sistema operativo hasta la automatización de reconocimiento.
Tutorial de Burp Suite en español desde cero: qué es, instalación y configuración del proxy (127.0.0.1:8080 + certificado CA), Proxy/Intercept, Repeater, Intruder, Decoder, extensiones útiles, Community vs Pro y un flujo real de caza.
Tutorial de ffuf en español: fuzzing de directorios, subdominios/vhosts y parámetros GET/POST, cómo filtrar ruido con -fc/-fs y calibrar con -mc/-ac, wordlists de SecLists y cuándo usar gobuster o dirsearch como alternativas.