一、什么是点击劫持
点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。
其关键作用的代码:
iframe{
900px;
height:250px;
position:absolute;
top:-195px;
left:-740px;
z-index:2;
-moz-opacity:0;
opacity:0;
filter:alpha(opacity=0);
}
通过控制iframe的长、宽,以及调整top、left的位置,可以把iframe页面内的任意部分覆盖到任何地方。同时设置iframe的position为absolute,并将z-index的值设置为最大,以达到
让iframe处于页面的最上层。最后,再通过设置opacity来控制iframe页面的透明程度,值为0是完全不可见的。
点击劫持与CSRF攻击有异曲同工之妙,都是在用户不知情的情况下诱使用户完成一些工作。但是在CSRF攻击的过程中,如果出现用户交互的页面,则攻击可能会无法顺利完成。与之相反的是,点击劫持没有这个顾虑,它利用的就是与用户产生交互的页面。
二、点击劫持案例
1、Flash点击劫持
2、图片覆盖攻击
3、拖拽劫持与数据窃取
4、手机触屏劫持
三、防御点击劫持
传统的方式一般是禁止跨域的iframe来防范。
1、frame busting
通常可以写一段JS代码,以禁止iframe的嵌套。
比如如下代码:
if ( top.location != location ){
top.location=self.location;
}
但是这种方式也存在缺陷。由于它是JS写的,控制能力并不是特别强,因此有许多方法可以绕过。
比如针对parent.location的iframe busting,就可以采用嵌套多个iframe的方法绕过。
if ( top.location != self.location){
parent.location = self.location;
}
绕过方式:
Attacker top frame:
<iframe src="attacker2.html">
Attacker sub-frame:
<iframe src="http://www.victim.com">
此外,像HTML5中iframe的sandbox属性,IE中iframe的security属性等,都可以限制iframe页面中的JS脚本执行,从而可以使得frame busting失效。
2、X-Frame-Options
由于上面的防御方式容易被绕过,所以一个比较好的方案是使用一个HTTP头——X-Frame-Options。
X-Frame-Options可以说是为了解决点击劫持而产生的。
有三个可选的值:
deny
sameorigin
allow-from origin
当值为deny时,浏览器会拒绝当前页面加载任何frame页面;
若值为sameorigin,则frame页面的地址只能为同源于域名下的页面;
若值为allow-from origin,则可以定义允许frame 加载的页面地址。
四、总结
点解劫持相对于xss与csrf来说,因为需要诱使用户与页面产生交互行为,因此实施攻击的成本更高,在网络犯罪中比较少见。但是点击劫持在未来任然有可能被攻击者
利用在钓鱼、欺诈和广告作弊等方面,不可不察。