En este post vamos a estar resolviendo el laboratorio: “DOM XSS in jQuery anchor href attribute sink using location.search source”:

Pantalla de inicio del laboratorio DOM XSS in jQuery anchor href attribute sink

En este caso, para resolver el laboratorio tenemos que ejecutar un alert que nos devuelva las cookies.

Lo primero de todo es acceder al laboratorio:

Página principal del laboratorio mostrando artículos del blog

Una vez accedidos, nos dirigimos a la parte de enviar feedback, ya que, en el enunciado es donde se nos indica que se encuentra el XSS:

Botón de Submit feedback en la página principal

Formulario de envío de feedback del laboratorio

Cuando accedemos, si nos fijamos en la URL, podemos ver que de forma por defecto se nos añade el parámetro returnPath:

URL mostrando parámetro returnPath en la barra de direcciones

Vamos a probar a añadirle cualquier valor al parámetro:

Parámetro returnPath modificado con valor de prueba

En principio no pasa nada, pero si ponemos el ratón encima del hipervínculo de Back:

Inspección del hipervínculo Back mostrando valor inyectado

Vemos como el valor que hemos colocado en la variable, se implementa en el atributo href de este elemento. Por lo que es tan sencillo como colocar un payload que nos ejecute el alert cuando demos click en el botón:

  • javascript:alert(document.cookie)

Payload JavaScript inyectado en el parámetro returnPath

Como vemos, conseguimos resolver el laboratorio, y desde el punto de vista del código fuente, lo que hemos conseguido es lo siguiente:

Código fuente HTML mostrando atributo href con payload JavaScript

Ahora, si damos click en el hipervínculo Back:

Mensaje de laboratorio resuelto satisfactoriamente

Se nos ejecutará el código Javascript que hemos indicado:

Ventana de alert mostrando cookies vacías

En este caso no nos sale nada porque la única cookie que tenemos, tiene la flag HTTPOnly habilitada:

Cookie de sesión con atributo HTTPOnly en herramientas de desarrollo

Esta flag habilita que las cookies solo puedan ser leídas desde el protocolo HTTP y no desde Javascript, es un mecanismo de defensa. Y con esto explicado, ya tendríamos el laboratorio hecho:

Confirmación final de éxito del laboratorio