En este post vamos a estar resolviendo el laboratorio: “Reflected DOM XSS”:

Pantalla de inicio del laboratorio Reflected DOM XSS

En este caso se nos indica que el servidor procesa los datos de una petición y lo muestra los datos de la respuesta. Posteriormente, un script de la página procesa los datos reflejados de una forma insegura. Para resolver el laboratorio debemos de ejecutar la función alert.

Dicho esto, lo primero de todo es acceder al laboratorio:

Página principal del laboratorio con formulario de búsqueda

Una vez accedidos, podemos observar un formulario que nos permite buscar en el blog. Para analizar mejor el comportamiento de esta funcionalidad, abrimos Burp Suite y activamos el proxy en el navegador:

Configuración del proxy en el navegador

Interceptor de Burp Suite activado y en espera

Con esto hecho, probamos a hacer cualquier búsqueda:

Formulario de búsqueda con término de prueba

Petición GET interceptada con parámetro de búsqueda

Cuando damos a Buscar, se genera la petición que podemos observar arriba. No hay mucha información, además de que en el enunciado nos hacen el spoiler de que la vulnerabilidad está en un script inseguro, por lo que podemos suponer que la primera petición de búsqueda no tiene mucha historia, por lo que simplemente la enviamos.

Cuando enviamos la primera petición de búsqueda, si mantenemos el intercept de Burp Suite puesto, interceptaremos la siguiente petición:

Segunda petición JSON interceptada generada por el frontend

Esta tiene pinta que ha sido generada por el frontend del recurso que se solicitó en la primera petición (/?search=test). Para analizar mejor su respuesta, la pasamos al repeater:

Respuesta JSON en Burp Suite Repeater mostrando término de búsqueda

El servidor nos devuelve una respuesta en formato JSON, donde en la parte inferior podemos observar el término de búsqueda que hemos colocado.

Podemos probar a intentar escaparnos del contexto del JSON en este caso, por ejemplo, a intentar meter un alert:

Payload de prueba inyectado en el parámetro de búsqueda

En la respuesta podemos observar como en principio parece que sin problemas podemos inyectar y escaparnos del JSON, ya que no hay ningún tipo de sanitización, por lo que, usando el payload de arriba, lo colocamos en la petición que dejamos en el proxy, y lo enviamos:

Petición con payload XSS enviada desde el proxy

Ejecución exitosa del alert mostrando XSS

De esta manera, conseguimos obtener un XSS y resolver el laboratorio:

Mensaje de laboratorio resuelto satisfactoriamente

Confirmación final de éxito del laboratorio