En este post vamos a estar resolviendo el laboratorio: “DOM XSS in document.write sink using source location.search inside a select element”.

Descripción del laboratorio DOM XSS

En este caso, para resolver el reto tenemos que escaparnos del elemento select y llamar a la función alert.

Lo primero de todo es acceder al laboratorio:

Página principal del laboratorio

Una vez hemos accedido, podemos ver varios productos. Vamos a entrar en uno cualquiera:

Lista de productos disponibles

Cuando entramos, podemos observar una función para comprobar el stock en las distintas ciudades:

Vista del producto individual

Selector de ciudades para verificar stock

Resultado de la verificación de stock

Si observamos el código fuente de la web, podemos encontrar el siguiente código:

Script JavaScript en el código fuente

Analizando un poco el script, básicamente se entiende que además de las tres ciudades por defecto para comprobar el stock, se le puede agregar una más a través de la variable storeId de la URL. Por lo que podemos probar a añadir esa variable y un valor cualquiera:

URL con parámetro storeId agregado

Una vez accedemos a la web de nuevo pero con la variable storeId, si nos fijamos en las ciudades:

Nueva ciudad agregada al selector

Podemos ver como se ha agregado una más, en concreto una con el nombre del valor que le hemos pasado a la variable.

Si nos vamos de nuevo al código fuente, podemos observar como este parámetro se implementa:

Implementación del parámetro en el código

Por lo que, observando esto, podemos intentar poner un valor que ocasione que nos escapemos del propio elemento options, y ejecute un alert:

URL con payload XSS malicioso

Al acceder a la web con este valor en la variable:

Ejecución exitosa del alert

Se nos ejecuta el alert. En el código fuente, podemos observar lo siguiente:

Código fuente mostrando el escape exitoso

Y de esta forma, conseguimos resolver el laboratorio:

Laboratorio completado exitosamente