JSForge
Acceder →
← Volver al catálogo
CLIENTEFÁCIL En navegador

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

app vulnerable · sandbox aislado

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.

    Verificación

    Se verifica en tu navegador contra un hash. La flag no se envía a ningún lado.