文章目录
点击劫持(ClickJacking)
1 什么是点击劫持
点击劫持是一种视觉欺骗手段。攻击者使用一个透明不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上操作,用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能按钮上。
原理很简单,代码示例略。
点击劫持与CSRF攻击都是在用户不知情的情况下诱使用户完成一些动作。但是在CSRF攻击过程中,如果出现用户交互的页面,则攻击可能无法完成。而点击劫持没有这个顾虑,他利用的就是与用户产生交互的页面。
2 Flash点击劫持
一个较为严重的ClickJacking案例,目前Adobe公司已经修复。攻击者构造一系列点击操作,最终控制了用户电脑摄像头。
过程如下:
- 制作一个Flash游戏,诱使用户来玩。游戏内容就是让用户去点击一个CLICK按钮,每次点击后这个按钮的位置都会发生变化。
- 在这个上面隐藏了一个看不见iframe。
- 某些点击是有意义的某些点击是没有意义的。
- 最终一步一步打开了摄像头。
3 图片覆盖攻击
Cross Site Image Overlaying,简称XSIO。通过调整图片的style使得,图片能够覆盖在他所指定的任意位置。
比如在自己的主页上,添加一个谷歌的搜索框控件,后面有个Powered by Google的logo,原本点击会进入谷歌主页,如果覆盖掉那个logo换成自己的img,则会进入其他网站(如钓鱼网站)。
图片还可以伪装得像一个正常的链接、按钮。或者在图片中构造一些文字,覆盖在关键的位置,用户甚至不需要点击也能达到欺骗的目的,比如利用XSIO修改页面中的联系电话。
由于<img>
标签在很多系统中是对用户开放的,因此在显示中 有很多站点存在被XSIO攻击的可能性。在防御XSIO时,需要检查用户提交的HTML代码中,<img>
标签的style属性是否可能导致浮出。
4 拖拽劫持与数据窃取
安全研究者Paul Stone在2010BlackHat大会上发表的演讲,提出“浏览器拖拽事件”导致的一系列安全问题。
很多浏览器开始支持Drag&Drop的API,对象可以是文字或链接,也可以从一个窗口拖拽到另一个窗口,所以拖拽不受同源策略的限制。
“拖拽劫持”的思路是诱使用户从隐藏的不可见的ifram中拖拽出攻击者希望得到的数据,然后放到攻击者能控制的另一个页面中,从而窃取数据。在JS和Java API的支持下,这个过程会变得非常隐蔽。
案例:国内安全研究者xisiger曾经构造了一个针对Gmail的POC。(代码见红宝书p132)。
5 ClickJacking3.0:触屏劫持
智能手机上的点击劫持—TapJacking。
从手机OS的角度来看,触屏操作就是一个事件,手机OS捕捉这些事件执行相应操作。
安全研究者在Android系统中实施TapJacking修改系统安全设置(2010年12月)
6 Click Jacking防御
6.1 frame busting
通过一段JS代码禁止iframe嵌套。
if(top.location != location){
top.location = self.location;
}
常见的frame busting方式见红宝书P136
但是由于他本身是JS代码,控制能力不是很强,有很多绕过的方法。
6.2 X-Frame-Option
相对更好的一种解决方案,使用一个HTTP头——X-Frame-Option。它有三个值可以选:
- DENY 浏览器会拒绝当前页面加载任何frame页面
- SAMEORIGION frame页面地址只能为同源域名下的页面
- ALLOW-FORM origin 可以加载frame
除此之外,还有firefox的“Content Security Policy”和NoScript扩展也能防御ClickJacking。
7 小结
相比于XSS和CSRF,点击劫持需要诱导用户进行交互,成本更高,所以相对少见一点,但仍然有可能被用作钓鱼欺诈广告作弊等方面。