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

Reflejo Peligroso

DOM XSS

// OBJETIVO

Conseguí que la página ejecute JavaScript arbitrario a partir de lo que escribís en el buscador, y capturá la flag que aparece al lograrlo.

// 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 buscador vuelca el término directamente en el DOM como HTML:

    searchInput.addEventListener('input', (e) => {
      const term = e.target.value;
      results.innerHTML = `Buscaste: ${term}`; // ← term entra sin escapar
    });

    Como innerHTML parsea el string como HTML, cualquier etiqueta que escribas se convierte en nodos reales. <img src=x onerror="alert(document.domain)"> alcanza para ejecutar código.

    Remediación

    El texto del usuario nunca debe interpretarse como markup. Usá textContent, que inserta el valor como texto plano:

    - results.innerHTML = `Buscaste: ${term}`;
    + results.textContent = `Buscaste: ${term}`;

    Por qué funciona: textContent no invoca el parser de HTML. Los caracteres <, > y & quedan como literales visibles en lugar de crear elementos, así que no hay forma de introducir un handler ni una etiqueta ejecutable.

    Verificación

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