2 - DOM XSS using web messages and a JavaScript URL
Desglose del Código:
-
Código de Redirección Vulnerable:
window.addEventListener('message', function(e) { var url = e.data; if (url.indexOf('http:') > -1 || url.indexOf('https:') > -1) { location.href = url; } }, false);- Este código escucha los mensajes enviados a través de
postMessage. - Luego, verifica si el contenido del mensaje (
e.data) contiene las cadenas'http:'o'https:'. - Si se encuentra una de estas cadenas, se redirige el navegador a la URL especificada en
e.datausandolocation.href.
- Este código escucha los mensajes enviados a través de
-
El Payload Malicioso:
<iframe src="https://YOUR-LAB-ID.web-security-academy.net/" onload="this.contentWindow.postMessage('javascript:print()//http:','*')">- Aquí, se utiliza un
iframepara cargar una URL y enviar un mensaje al contenido de ese iframe utilizandopostMessage. - El mensaje enviado es
'javascript:print()//http:'.
- Aquí, se utiliza un
-
Cómo Funciona la Inyección:
javascript:URI: En navegadores, un URI que comienza conjavascript:indica que el navegador debería interpretar el resto de la cadena como código JavaScript y ejecutarlo. Por ejemplo,javascript:print()ejecutaría la funciónprint()directamente en el navegador.- Comentando la Validación: El payload
'javascript:print()//http:'incluye'//http:', que es un comentario en JavaScript. Esto es ingenioso porque la validación en el código original busca'http:'o'https:'. Al agregar'//http:'al final de la cadena, se engaña al código para que pase la validación y luego todo lo que sigue después de//es ignorado en la ejecución dejavascript:print(), debido a que es tratado como un comentario.
-
Redirección a
javascript::- Si el payload se recibe: Si el código vulnerable recibe el mensaje
'javascript:print()//http:', elifevalúa como verdadero porque encuentra'http:'. - Redirección: Entonces,
location.href = 'javascript:print()//http:'redirige el navegador a una URIjavascript:. Esto ejecuta el códigoprint(), que abre el cuadro de diálogo de impresión del navegador.
- Si el payload se recibe: Si el código vulnerable recibe el mensaje
Resumen:
- Engaño en la Verificación: El uso de
'//http:'como comentario permite engañar la validación en el código original, que está diseñado para redirigir solo si encuentra'http:'o'https:'en el mensaje. - Ejecución del Payload: Como resultado, el navegador interpreta la cadena
javascript:print()como código a ejecutar, lo que activa la funciónprint().
Este tipo de ataque es conocido como JavaScript injection a través de la URI javascript: y es una forma de vulnerabilidad XSS. En un entorno real, este tipo de ataque podría tener consecuencias mucho más serias si el código inyectado realizara acciones más dañinas.
javascript:print() es una url más