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.
| 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 |
cd labs/appsec-web
docker compose up -d
docker compose ps # verifica que ambos estén "running"
Luego abre en el navegador:
setup.php.admin / password (credenciales del propio lab).Juice Shop no requiere configuración: arranca listo.
Ten Burp Suite o ZAP interceptando el tráfico para ver y modificar las peticiones.
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).
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.
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.
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.
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.docker compose down # detiene y elimina los contenedores
docker compose down -v # además borra volúmenes/datos del lab
| 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. |