Lab: AppSec Web — OWASP Juice Shop + DVWA

Entorno de práctica para la Parte 4 — Seguridad de aplicaciones web (clases 086–115). Levanta dos aplicaciones deliberadamente vulnerables para practicar el OWASP Top 10 con herramientas reales (navegador + Burp/ZAP).

⚠️ Solo laboratorio local. Ambas apps son inseguras a propósito. Escuchan únicamente en 127.0.0.1. No las expongas a ninguna red ni las uses como plantilla de producción. Practica solo aquí o en sistemas con autorización explícita.

🎯 Qué vas a practicar

Objetivo App Clases
Reconocimiento y mapeo de la app Ambas 090
Inyección SQL (login bypass, extracción) DVWA / Juice Shop 091, 092
XSS reflejado / almacenado / DOM DVWA / Juice Shop 096, 097
Control de acceso roto (IDOR) Juice Shop 105
Command injection DVWA 095
Uso de Burp Suite Ambas 088

🚀 Levantar el laboratorio

cd labs/appsec-web
docker compose up -d
docker compose ps          # verifica que ambos estén "running"

Luego abre en el navegador:

Configuración inicial de DVWA (una sola vez)

  1. Entra a http://127.0.0.1:8080; te redirige a setup.php.
  2. Pulsa Create / Reset Database.
  3. Inicia sesión con el usuario por defecto admin / password (credenciales del propio lab).
  4. Ve a DVWA Security y pon el nivel en Low para empezar; súbelo a Medium/High conforme avances.

Juice Shop no requiere configuración: arranca listo.

🧭 Recorrido guiado

Ten Burp Suite o ZAP interceptando el tráfico para ver y modificar las peticiones.

1. Inyección SQL — bypass de login (DVWA, nivel Low)

En DVWA → SQL Injection, prueba en el campo de ID el clásico payload de tautología:

1' OR '1'='1

Observa cómo la consulta devuelve todos los registros. Repasa el por qué en la Clase 091 y luego sube DVWA a Medium para ver cómo cambia (y por qué las consultas parametrizadas lo eliminan).

2. XSS reflejado y almacenado (DVWA / Juice Shop)

En DVWA → XSS (Reflected), introduce en el campo de nombre:

<script>alert(document.domain)</script>

En Juice Shop, busca el campo de búsqueda y prueba XSS basado en DOM. Contrasta reflejado vs almacenado con la Clase 097.

3. Command injection (DVWA)

En DVWA → Command Injection, en el campo de IP prueba a encadenar un comando:

127.0.0.1; whoami

Relaciónalo con la Clase 095 y prueba los separadores alternativos cuando subas el nivel de seguridad.

4. Control de acceso roto — IDOR (Juice Shop)

Inicia sesión, abre tu cesta y observa el identificador en la petición (/rest/basket/<id>). Cámbialo con Burp para intentar ver la cesta de otro usuario. Repasa la Clase 105.

🏆 Retos verificables

  1. Login bypass: entra a DVWA SQL Injection y extrae los hashes de contraseñas de la tabla de usuarios. Aceptación: obtienes al menos un hash y explicas la consulta inyectada.
  2. XSS persistente: logra que un alert() se ejecute para cualquier visitante de una página (no solo para ti). Aceptación: el payload sobrevive a recargar la página desde otra sesión.
  3. Juice Shop scoreboard: encuentra el panel de puntuación oculto y resuelve al menos 3 retos de dificultad ⭐. Aceptación: aparecen resueltos en el Score Board.
  4. Defensa: por cada vulnerabilidad anterior, escribe la corrección (consulta parametrizada, codificación de salida, control de acceso del lado servidor) citando la clase correspondiente.

🧯 Apagar y limpiar

docker compose down          # detiene y elimina los contenedores
docker compose down -v       # además borra volúmenes/datos del lab

🛠️ Problemas comunes

Síntoma Causa y solución
port is already allocated Otro servicio usa el 3000/8080. Cambia el mapeo host en docker-compose.yml (p. ej. 127.0.0.1:3001:3000).
DVWA muestra error de base de datos No pulsaste Create / Reset Database en setup.php. Hazlo una vez.
Juice Shop tarda en responder El contenedor aún arranca; espera a que el healthcheck pase (docker compose ps).
No veo el tráfico en Burp El navegador no está usando el proxy (127.0.0.1:8080 de Burp) o falta el certificado CA de Burp. Revisa la Clase 088.

🔗 Referencias