A Dónde Te Llevo
Open Redirect
// OBJETIVO
Conseguir que la redirección post-logout te saque del sitio hacia un dominio controlado por el atacante.
// ZONA DE ATAQUE
Corre en un iframe de origen opaco: no puede leer este sitio ni tu progreso. Cuando logres el exploit, la flag aparece dentro de la app — copiala y verificala.
// CONSULTÁ
Pistas
Código vulnerable
El destino de la redirección sale directo del input del usuario:
function continuar() {
const next = params.get('next'); // ← controlado por el usuario
window.location = next; // redirige a donde sea
}
Como next no se valida, cualquier valor con esquema (https://…,
javascript:…) o relativo al protocolo (//evil.example) manda a la víctima a
un dominio ajeno. Es la base de campañas de phishing: el enlace parece de tu
sitio, pero el rebote termina en el del atacante.
Remediación
No navegues nunca a una URL entera provista por el usuario; tratá next como
una ruta interna y validá que lo sea:
- const next = params.get('next');
- window.location = next;
+ const next = params.get('next') || '/';
+ // Solo rutas internas: una barra, y no "//host" (relativa al protocolo).
+ const safe = next.startsWith('/') && !next.startsWith('//') ? next : '/';
+ window.location = safe;
Por qué funciona: al exigir que empiece con / y descartar //, el destino
queda anclado a tu propio origen. Cualquier URL absoluta o con esquema cae al
fallback /, así que la redirección no puede salir del sitio. Para casos con
varios destinos válidos, usá una allowlist en vez de la URL cruda.