点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。
通过控制iframe的长、宽,以及调整top、left的位置,可以把iframe页面内的任意部分覆盖到任何地方。同时设置iframe的position为absolute,并将z-index的值设置为最大,以达到让iframe处于页面的最上层。最后,再通过设置opacity来控制iframe页面的透明程度,值为0是完全不可见。
这样,就完成了一次点击劫持的攻击。
点击劫持攻击与CSRF攻击有异曲同工之妙,都是在用户不知情的情况下诱使用户完成一些动作。但是在CSRF攻击的过程中,如果出现用户交互的页面,则攻击可能会无法顺利完成。与之相反的是,点击劫持没有这个顾虑,它利用的就是与用户产生交互的页面。
xsio
Cross Site ImageOverlaying攻击,简称XSIO。通过调整图片的style使得图片能够覆盖在所指定的任意位置。XSIO不同于XSS,它利用的是图片的style,或者能够控制CSS。如果应用没有限制style的po-sition为absolute的话,图片就可以覆盖到页面上的任意位置,形成点击劫持。
图片还可以伪装得像一个正常的链接、按钮;或者在图片中构造一些文字,覆盖在关键的位置,就有可能完全改变页面中想表达的意思,在这种情况下,不需要用户点击,也能达到欺骗的目的。
由于<img>标签在很多系统中是对用户开放的,因此在现实中有非常多的站点存在被XSIO攻击的可能。在防御XSIO时,需要检查用户提交的HTML代码中,<img>标签的style属性是否可能导致浮出。
拖拽劫持
目前很多浏览器都开始支持Drag &Drop 的API。对于用户来说,拖拽使他们的操作更加简单。浏览器中的拖拽对象可以是一个链接,也可以是一段文字,还可以从一个窗口拖拽到另外一个窗口,因此拖拽是不受同源策略限制的。“拖拽劫持”的思路是诱使用户从隐藏的不可见iframe中“拖拽”出攻击者希望得到的数据,然后放到攻击者能控制的另外一个页面中,从而窃取数据。在JavaScript或者Java API的支持下,这个攻击过程会变得非常隐蔽。因为它突破了传统Click-Jacking一些先天的局限,所以这种新型的“拖拽劫持”能够造成更大的破坏。
触屏劫持
通过将一个不可见的iframe覆盖到当前网页上,可以劫持用户的触屏操作。而手机上的屏幕范围有限,手机浏览器为了节约空间,甚至隐藏了地址栏,因此手机上的视觉欺骗可能会变得更加容易实施。
一次触屏操作,可能会对应以下几个事件:
touchstart,手指触摸屏幕时发生;
touchend,手指离开屏幕时发生;
touchmove,手指滑动时发生;
touchcancel,系统可取消touch事件。
防御
针对传统的ClickJacking,一般是通过禁止跨域的iframe来防范。通常可以写一段JavaScript代码,以禁止iframe的嵌套。这种方法叫framebusting。HTML 5中iframe的sandbox属性、IE中iframe的security属性等,都可以限制iframe页面中的JavaScript脚本执行,从而可以使得frame busting失效。
因为frame busting存在被绕过的可能,所以我们需要寻找其他更好的解决方案。一个比较好的方案是使用一个HTTP头——X-Frame-Options。
X-Frame-Options可以说是为了解决Click-Jacking而生的,目前有以下浏览器开始支持X-Frame-Options: IE 8+ ;Opera 10.50+ ;Safari 4+ ;Chrome 4.1.249.1042+ ;Firefox 3.6.9 (or earlier withNoScript)
它有三个可选的值:
DENY
SAMEORIGIN
ALLOW-FROM origin
当值为DENY时,浏览器会拒绝当前页面加载任何frame页面;若值为SAMEORIGIN,则frame页面的地址只能为同源域名下的页面;若值为AL-LOW-FROM,则可以定义允许frame加载的页面地址。
除了X-Frame-Options之外,Firefox的“Content Security Policy”以及Firefox的No-Script扩展也能够有效防御ClickJacking。
在HTML 5中,专门为iframe定义了一个新的属性,叫sandbox。使用sandbox这一个属性后,<iframe>标签加载的内容将被视为一个独立的“源”(源的概念请参考“同源策略”),其中的脚本将被禁止执行,表单被禁止提交,插件被禁止加载,指向其他浏览对象的链接也会被禁止。
sandbox属性可以通过参数来支持更精确的控制。有以下几个值可以选择:
allow-same-origin:允许同源访问;
allow-top-navigation:允许访问顶层窗口;
allow-forms:允许提交表单;
allow-scripts:允许执行脚本。
可有的行为即便是设置了allow-scripts,也是不允许的,比如“弹出窗口”。