Reflected XSS in canonical link tag
Laboratorio de Portswigger sobre XSS
Certificaciones
- eWPT
- eWPTXv2
- OSWE
- BSCP
Descripción
Este laboratorio refleja la entrada del usuario en una etiqueta link canónica y escapa los corchetes angulares. Para resolver el laboratorio, debemos realizar un ataque de cross-site scripting en la página principal que inyecte un atributo que llame a la función alert. Para ayudarte con la explotación, podemos asumir que el usuario simulado presionará las siguientes combinaciones de teclas ALT+SHIFT+X, CTRL+ALT+X y Alt+X
Guía de XSS
Antes de completar este laboratorio es recomendable leerse esta guía de XSS https://justice-reaper.github.io/posts/XSS-Guide/
Resolución
Al acceder a la web nos sale esto
En el desarrollo web y la optimización de motores de búsqueda (SEO), canónico significa la versión preferida o principal de una página web cuando hay varias URLs que muestran el mismo contenido. Ayuda a los motores de búsqueda a identificar la mejor versión para mostrar en los resultados de búsqueda
Por ejemplo, si tienes una página web a la que se puede acceder a través de diferentes URLs debido a parámetros o etiquetas de seguimiento (por ejemplo, https://example.com/page y https://example.com/page?utm_source=google), es posible que desees designar una URL como versión canónica para evitar diluir las clasificaciones de los motores de búsqueda y consolidar la autoridad de la página
Esta vez, la web no incorpora una función de búsqueda, pero si visualizamos el código fuente de la página, haciendo click derecho en cualquier parte de la página y seleccionando Ver código fuente de la página en el menú desplegable, podremos ver el enlace canónico de nuestra página de blog. Esto nos permitirá encontrar la URL principal para la página y ver cómo está implementado el link canónico
Dado que nuestra página de blog no tiene una barra de búsqueda, esto no significa que no podamos intentar agregar una consulta al final de la URL de la web. Para ello, debemos agregar un signo de interrogación (?) y una cadena alfanumérica que sepamos que no aparecerá en ningún otro lugar de la página. En mi caso, voy a acceder a https://0a25000b048de3448023855d00c90069.web-security-academy.net/?testing, si nos fijamos bien, el href está entre comillas simples al inspeccionar el código fuente de la web
Sin embargo, si echamos un vistazo al inspector de Chrome en la parte de elements, vemos que se encuentra entre comillas dobles. Esto se debe a que el código entre comillas simples está siendo cargado así directamente desde el servidor, y es en el DOM donde esta cadena se cambia a comillas dobles
Esto ocurre porque cuando el navegador procesa el HTML, crea una representación del documento en forma de DOM. En esta representación, el navegador sigue las convenciones estándar, una de las cuales es mostrar los atributos de HTML con comillas dobles, independientemente de cómo se escribieron originalmente en el código fuente. Esto es un comportamiento normal del navegador al interpretar y renderizar el HTML, y nos ayuda a entender cómo se presentan los datos en la página
Podemos intentar escapar de las comillas simples e inyectar atributos en la etiqueta <link>. Hay varios payloads en https://portswigger.net/web-security/cross-site-scripting/cheat-sheet que podríamos usar si el <link> estuviese en otra parte diferente que no fuese el <head>
Los elementos en el <head>, como <link> o <title>, no están diseñados para ser interactivos. No se pueden enfocar ni interactuar con ellos a través de métodos convencionales como la tecla Tab o el click, ya que están fuera del flujo visual de la web. Cualquier intento de hacerlos interactivos, como agregar onfocus a un <link>, no tendrá efecto en términos de interfaz de usuario, aunque puede ser relevante para vulnerabilidades como XSS si esos elementos son procesados o manipulados incorrectamente por el servidor o el cliente. Sin embargo, este no es el caso en este laboratorio
En estos casos, lo único que podemos hacer es aprovecharnos de las access keys para ejecutar el XSS. Esto nos permitirá asociar un evento de JavaScript con una tecla de acceso y ejecutar el payload
Si usamos este payload 'accesskey='X'onclick='alert(1) y pulsamos Alt + Shift + X, si estamos en Windows podremos explotar el XSS de manera exitosa







