DOM XSS using web messages and JSON.parse - Portswigger

En este laboratorio de PortSwigger nuestro objetivo será que una víctima ejecute un print() a través de un DOM XSS. Para ello, deberemos de encontrar un XSS e intentar infectar a la víctima a través del exploit server.

Laboratorio: DOM XSS using web messages and JSON.parse

Índice

Reconocimiento del DOM XSS

Si indagamos en el código de la página web en el path / podemos encontrarnos con el siguiente script:

Vulnerable script

Como se puede ver en el script, añade un Listener de tipo message el cual tomará el mensaje recibido y dependiendo de una propiedad llamada type hará una acción u otra.

Si buscamos que parte de este código podemos usar a nuestro favor para ejecutar javascript nos fijaremos en el código que ejecuta cuando el type es load-channel ya que seteará la url que tiene el objeto dado en la propiedad url.

Habiendo detectado esta falla, intentaremos mandar un mensaje con un objecto malicioso para intentar ejecutar javascript a través de inyectar en el src del iframe que crea el código vulnerable con el payload javascript:alert(1):

XSS payload working

El payload funciona como esperábamos así que pasaremos a pasárselo a la víctima.

Exploit server

Guardaremos el siguiente HTML en el exploit server:

<iframe 
  src=https://urlDelLab.net/ 
  onload='this.contentWindow.postMessage("{\"type\":\"load-channel\",\"url\":\"javascript:print()\"}","*")'
>

Esto crea un iframe en el cliente de la víctima el cual en cuanto cargue se ejecutará el postMessage malicioso que creamos antes.

Una vez se envíe complatermos el laboratorio.