首页
社区
课程
招聘
[转帖]Clickjacking简单介绍
发表于: 2014-11-11 12:48 1790

[转帖]Clickjacking简单介绍

2014-11-11 12:48
1790
0x00 相关背景介绍

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

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

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

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

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

事实上,这种代码很容易被绕过,在后文中讨论。
0x01 防御的几种方式

防止frame嵌套的js使用代码由高到低比例:

if (top != self)
if (top.location != self.location)
if (top.location != location)
if (parent.frames.length > 0)
if (window != top)
if (window.top !== window.self)
if (window.self != window.top)
if (parent && parent != window)
if (parent && parent.frames && parent.frames.length>0)
if((self.parent&&!(self.parent===self))&&(self.parent.frames.length!=0))

检测到后的处理方案:

top.location = self.location
top.location.href = document.location.href
top.location.href = self.location.href
top.location.replace(self.location)
top.location.href = window.location.href
top.location.replace(document.location)
top.location.href = window.location.href
top.location.href = "URL"
document.write('')
top.location = location
top.location.replace(document.location)
top.location.replace('URL')
top.location.href = document.location
top.location.replace(window.location.href)
top.location.href = location.href
self.parent.location = document.location
parent.location.href = self.document.location
top.location.href = self.location
top.location = window.location
top.location.replace(window.location.pathname)
window.top.location = window.self.location
setTimeout(function(){document.body.innerHTML='';},1);
window.self.onload = function(evt){document.body.innerHTML='';}
var url = window.location.href; top.location.replace(url)

0x02 绕过的几种方式

对于使用parent.location来防御的可以使用多层嵌套的方式绕过。
一、例如防御代码为:

if(top.location!=self.location){
     parent.location = self.location;
}

建立两个页面:

1.html代码为:

<iframe src="2.html">

2.html代码为:

<iframe src="http://a5cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4k6A6j5%4c8A6L8g2)9J5k6h3y4G2L8b7`.`.">

访问1.html之后可以看到页面并无跳转等动作。


二、onBeforeUnload函数的利用:

onBeforeUnload的介绍以及各种浏览器的支持情况请见:

710K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4M7K6K9r3g2D9M7q4)9J5k6h3!0J5k6#2)9J5c8Y4A6Z5i4K6u0V1j5$3&6Q4x3V1k6U0j5i4g2K6k6i4y4Q4x3V1k6n7h3o6t1H3y4o6M7`.

如下的防御代码:

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

新建立页面,代码如下:

<script>
var framekiller = true;
window.onbeforeunload = function() { if(framekiller) { return
"Write something here to keep people stay!";} };
</script>
<iframe src="http://544K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4k6A6j5%4c8A6L8g2)9J5k6h3y4G2L8g2)9J5c8R3`.`.">

打开页面显示如下:



欺骗用户点击留在此页后显示:

三、XSS filter的利用

IE8以上以及Chrome浏览器都有XSS筛选器,这些可以用来对付防御frame嵌套的代码。

防御代码如下:

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

新建立页面,代码如下:

<iframe src="http://90cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4k6A6j5%4c8A6L8g2)9J5k6h3y4G2L8g2)9J5c8W2)9K6c8W2)9J5y4X3I4@1i4K6y4n7M7$3y4J5K9i4m8@1i4K6t1$3k6%4c8Q4x3@1t1`.">

访问后页面显示:



IE的xss筛选器自动拦截了跳转。

斯坦福的文章里写了Chrome也会出现这种情况,并给出了攻击代码:

<iframe src=c13K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4k6A6j5%4c8A6L8g2)9J5k6h3y4G2L8g2)9J5c8W2)9K6c8Y4k6Q4x3@1c8A6k6W2)9J5z5s2c8G2M7q4)9J5b7W2)9J5x3g2)9J5y4e0y4p5i4K6u0n7M7$3g2D9k6W2)9J5z5g2)9J5b7W2)9J5y4e0N6n7i4K6u0n7N6r3!0H3i4K6u0W2L8r3!0U0j5i4c8A6L8$3&6Q4x3U0f1K6c8s2y4W2L8r3k6Q4x3X3g2D9L8$3y4S2N6r3W2G2L8W2)9J5y4e0y4n7i4K6u0n7i4K6t1#2y4@1b7`.">

但是测试发现,新版的Chrome并不会拦截了,会直接跳转过去。

如果跟的参数中有变量在页面中显示的,会把变量过滤一遍再输出,但不会阻止跳转。
四、Referer检查的问题

有一些站点允许自己的域名嵌套自己,禁止外站对自己的嵌套。

通常是用document.referer来检测来源是否为自己的域名。

if(top.location!=location){
    if(document.referrer && document.referrer.indexOf("aaa.com")==1)
    {
        top.location.replace(document.location.href);
    }
}

判断字符串中是否含有本域名是常见的错误用法,利用二级域名的方式便可绕过,如:

460K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4S2j5g2)9J5k6h3y4G2L8g2)9J5k6h3u0T1j5W2)9J5k6h3y4G2L8b7`.`.

注:从https域下post数据到http域的时候,浏览器不带Referer。

IE有个属性可以设置security为restricted可以禁止iframe里执行js脚本,但是要达到点击劫持的效果,必须要能够执行js所以很鸡肋。

代码如下:

<iframe src="http://d43K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4k6A6j5%4c8A6L8g2)9J5k6h3y4G2L8g2)9J5c8X3W2X3M7X3q4E0k6g2)9J5k6h3S2@1L8h3H3`." security="restricted"></iframe>

重点是手机站点,很多主站做的很不错,但是手机站点没有做任何防护,很容易造成点击劫持。
五、location劫持

在IE浏览器中,如果能够在防御代码的前面可以插入form表单的话,可以利用form表单对location进行劫持。

<form name=self location="javascript:alert(1)"></form>
<script>
if(top!=self){
   top.location=self.location
}
</script>

用iframe嵌套此代码,可以看到没有跳转,执行了alert(1)。

相关案例:

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

WooYun: 新浪微博遭受clickhijacking攻击(已经有大量案例)
0x03 推荐防御的方法:
一、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>

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1626
活跃值: (163)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
Hijack攻击揭秘
上传的附件:
2014-11-11 13:45
0
雪    币: 55
活跃值: (531)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
谢谢,有用。
2014-11-11 14:07
0
游客
登录 | 注册 方可回帖
返回