什么是点击劫持

点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

点击劫持攻击与CSRF攻击有异曲同工之妙,都是在用户不知情的情况下诱使用户完成一些动作。但是在CSRF攻击的过程中,如果出现用户交互的页面,则攻击可能会无法顺利完成。与之相反的是,点击劫持没有这个顾虑,它利用的就是与用户产生交互的页面。

Flash点击劫持

一个例子:

首先,攻击者制作了一个Flash游戏,并诱使用户来玩这个游戏。这个游戏就是让用户去点击“CLICK”按钮,每次点击后这个按钮的位置都会发生变化。在其上隐藏了一个看不见的iframe。通过一步步的操作,最终打开了用户的摄像头。

图片覆盖攻击

点击劫持的本质是一种视觉欺骗。顺着这个思路,还有一些攻击方法也可以起到类似的作用,比如图片覆盖,Cross Site Image Overlaying攻击,简称XSIO。

由于<img>标签在很多系统中是对用户开放的,因此在现实中有非常多的站点存在被XSIO攻击的可能。在防御XSIO时,需要检查用户提交的HTML代码中,<img>标签的style属性是否可能导致浮出。

拖拽劫持与数据窃取

目前很多浏览器都开始支持Drag & Drop的API。对于用户来说,拖拽使他们的操作更加简单。浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽是不受同源策略限制的。

“拖拽劫持”的思路是诱使用户从隐藏的不可见iframe中“拖拽”出攻击者希望得到的数据,然后放到攻击者能控制的另外一个页面中,从而窃取数据。

在JavaScript或者Java API的支持下,这个攻击过程会变得非常隐蔽。因为它突破了传统ClickJacking一些先天的局限,所以这种新型的“拖拽劫持”能够造成更大的破坏。

ClickJacking 3.0:触屏劫持

智能手机为人们提供了更先进的操控方式:触屏。从手机OS的角度看,触屏实际上就是一个事件,手机OS捕捉这些事件,并执行相应的动作。

通过将一个不可见的iframe覆盖到当前网页上,可以劫持用户的触屏操作。

而手机上的屏幕范围有限,手机浏览器为了节约空间,甚至隐藏了地址栏,因此手机上的视觉欺骗可能会变得更加容易实施。

防御ClickJacking

针对传统的ClickJacking,一般是通过禁止跨域的iframe来防范。

frame busting

通常可以写一段JavaScript代码,以禁止iframe的嵌套。这种方法叫frame busting。

但是frame busting也存在一些缺陷,由于它是用JavaScript写的,控制能力并不是特别强,因此有很多方法可以绕过它。

像HTML5中iframe的sandbox属性、IE中iframe的srcurity属性等,都可以限制iframe页面中的JavaScript脚本执行,从而可以使得frame busting失效。

X-Frame-Options

因为frame busting存在被绕过的可能,所以我们需要寻找寻找其他更好的解决方案。一个比较好的方案是使用一个HTTP头——X-Frame-Options。

它有三个可选的值:

DENY、SAMEORIGIN、ALLOW-FROM origin。

当值为DENY时,浏览器会拒绝当前页面加载任何frame页面;若值为SAMEORIGIN,则frame页面的地址只能为同源域名下的页面;若值为ALLOW-FROM,则可以定义允许frame加载的页面地址。