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
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.