Open Redirect Playground
Un SaaS ficticio (Lumen Workspace) cuyo endpoint de cierre de sesión acepta un destino arbitrario en `redirect_url`. El servidor hace `res.redirect(302, …)` con el valor tal cual, sin validar same-origin, esquema ni host.
Este hackeo se reportó sin recompensa
Aprende a encontrar este bug
Un hackeo real de YesWeHack, reproducido para que lo practiques.
Crea tu cuenta y practica bugs reales que se pagaron. Descarga el entorno, encuéntralo y aprende la técnica exacta — tu camino a tu primer bounty.
hunters entrenando
labs de hackeos reales
completaciones
pagados por estos bugs
Acceso a todos los labs · sin permanencia · cancela cuando quieras
Hackers que lo han resuelto· 8
Objetivos
Logro que recibirás
Cuando resuelvas este lab desbloqueas este logro compartible

Writeups de la comunidad
La checklist que repaso en cada objetivo nuevo
47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.
Te das de baja en un clic, desde cualquier correo.
Descripción del lab
Lumen Workspace es un producto inventado: un canvas de notas y workspaces compartidos al estilo Linear/Notion. El landing tiene hero animado, feature cards con stagger, y un menú de cuenta en la esquina superior derecha con un input "After sign out, send me to" deliberadamente expuesto.
La feature "redirect after logout" existe porque (según la narrativa) el equipo de growth quería que los usuarios pudieran ser devueltos a una landing de campaña al cerrar sesión desde un email. Para soportar esa UX, el endpoint acepta tanto rutas relativas como URLs absolutas y, de forma "intencionadamente flexible", no impone allowlist.
El bug vive en server/src/routes/auth.ts:
router.get('/logout', (req, res) => {
res.clearCookie('lumen_token');
const next = (req.query.redirect_url as string) || '/';
return res.redirect(302, next);
});
No hay decoys complejos — esto es un lab básico. Las páginas de Dashboard / Profile / Activity / Workspaces existen para que el lab se sienta como una app real, no como una página estática con un solo botón.
Cómo verificar (sustituye al flag)
# 1) Levantar el lab
./autodeploy.sh deploy
# (o: docker compose up --build -d)
# 2) PoC automatizado — confirma el 302 a host externo
python3 exploit.py
# 3) Suite de tests — 6 checks end-to-end
pip install -r tests/requirements.txt
python3 tests/verify.py
Los criterios de éxito están definidos en tests/verify.py:
| # | Check | Cómo |
|---|---|---|
| 1 | Smoke: el lab responde en localhost:1402 |
GET / → 200 |
| 2 | Registro de usuario funciona | POST /api/auth/register → 200 + token |
| 3 | Login funciona | POST /api/auth/login → 200 + token |
| 4 | VULN PRESENTE: redirect arbitrario externo | GET /api/auth/logout?redirect_url=https://example.com/x → 302 + Location: https://example.com/x |
| 5 | Endpoint legítimo requiere auth | GET /api/auth/me sin token → 401 |
| 6 | Variantes peligrosas también funcionan | GET /api/auth/logout?redirect_url=//example.com → 302 con Location protocol-relative |
Diferencias con otros labs de Open Redirect del repo
| Lab | Categoría | Foco |
|---|---|---|
| Basic_OR (este) | Easy · Playground | Vuln trivial + UI súper pulida + páginas explicativas |
Nexora |
Hard · Gold | Backslash bypass + bot Puppeteer arrastrando X-ULTRA-SECRET-TOKEN |
| Legacy "Open Redirect Logout function" | Easy | Comentarios // VULNERABLE: visibles — pendiente de refactor |
Si vienes "del cole" y quieres verlo paso a paso, empieza aquí. Si ya entiendes el patrón y quieres encadenar con OAuth/cookie smuggling, salta a Nexora.
