原文首发:看雪论坛http://bbs.pediy.com/thread-217315.htm
04
指定站点攻击
虽然多数站点使用如前面所谈到的流行的framebusting技术,但是一些站点选择开发自身的framebusting技术,在这部分,我们将讨论一些在调查中发现的很有趣的防御手段,并且展示一些相关的技术来挫败他们。
4.1
黑暗中的一束光
Facebook的framebusting方法和流行的方法大不相同。它不是在自身框架外进行破坏,而是插入一个灰色的半透明div标签,这个标签包括了一个框架页面的所有内容,当用户点击div的任何一处,facebook就破坏框架。这个巧妙的方法允许内容被框架的同时,阻止了点击劫持攻击。以下是带漏洞的代码版本,我们已经报告给facebook。
If(top!= self){
Window.document.write(“
0.5;filter:alpha(opacity=50);position:absolute; top:0px; left:0px;
width:9999px;height:9999px; z-index:
1000001’ onClick=’top.location.href=window.location.href’>”)
当被框架时,这段代码插入一个黑色的9999*9999像素,50%透明的(0,0)处的div标签。因为所有出这个div之外的facebook内容都在框架之中,这个保护可以被载入足够大的框架挫败,由此整个框架的中心久位于黑色的div区域外。内容自然地流动到框架的中心并被直接显示给用户并且没有被黑色覆盖,框架代码如下,相应的页面如图5
border : 0 px ; margin : 0 px ; ">
s r c=" http :/ / facebook . com/"
frameborder="0"
marginheight="0" marginwidth="0" >
window . s c ro l l T o ( 1 0 2 0 0 , 0 ) ;
移除
点击此处添加图片说明文字
Figure 5:Facebook’s elegant black layer defense
注意到 scrollTo 函数动态翻转滚动到 frame 的中心,这样内容出现得很清除。
4.2
域检查错误
USBank使用framebusting代码来检测referrer字段从而判断是否能够被框架化。工作代码如下:
i f ( s e l f!= top ) {
var dom = getDom( document . r e f e r r e r ) ;
var okDom = /usbank j l o c a lh o s t | usbnet / ;
var matchDomain = dom . search (okDom ) ;
i f ( matchDomain == -1){ //b u s t}
getDomain是一个用来返回URL中的域名信息,注意到任何包含USBank的都将被允许来框架页面,这完全不是开发者所希望的。举例来说,挪威的statehousebank(http://www.husbank.no)和莫斯科银行(http://www.rusbannk.org)都可互相来被允许框架页面,因为两者的域名中都包含由字符串usbank
4.3
信任问题
Myspace.com的framebusting代码:
移除
点击此处添加图片说明文字
代码被设计成允许myspace被谷歌图片所框架。然而谷歌图片谷歌图片没有framebusting,结果就是一个攻击者框架谷歌图片然后通过谷歌额图片来框架myspace。因为myspace接收到来自谷歌图片的referrer它并不会识图导出框架。结果如图六所示:
移除
点击此处添加图片说明文字
Figure 6: Because MySpace whitelists Google in
这个例子显示在framebusting的情景下,相互的信任关系会变得很危险。一个兄弟站点不使用framebusting会导致受信页面被攻击者框架化
05
安全地framebusting
现在我们将角度转到防御者的角度,讨论如何是一个占地那避免被框架化。首先我们回顾相关的用户端的额特点,然后给出一段有效抵御现有攻击的framebusting代码
5.1
x-frame-options
微软在IE8中为了抵抗点击劫持攻击特意引入了x-frame-options,这是一个HTTP响应报文中的报头,这个字段有两个不同的值:DENY和SAMEORIGIN。当时用DENY时,IE8将会在请求站点的框架内容中进行渲染。如果使用的是SAMEORIGIN,IE只会在顶层浏览内容来源和包含指令内容来源不同时才会禁止该页面。
尽管这个机制很有效,但是它还是有三个主要的局限。
每页策略指定:
该策略需要为每个页面指定,这可能使部署复杂化。为提供全面强制执行策略的能力,例如在登陆的时候,可以简化采用。
多域名问题
在目前的实现下不允许网站管理员提供允许框架网页的白名单,虽然白名单可能是危险的,但在某些情况下,管理员可能无法选择而至鞥你使用主域名。
代理
网络代理在添加,删除头部字段方面是臭名昭著的,如果一个网络代理剔除了x-frame-options字段,那网站将失去它的框架保护
x-frame-options已经被浏览器开发商迅速采用,出了firefox之外,每个最新版本的浏览器都使用了这个技术,danfirefox通过NoScriptfirefox插件提供此项功能。
但是在web方面采用较慢,最新一项调查显示,在top10000中只有4个网站使用了它,这个结论是和我们的观察是一致的,我们观察到只有三个站点使用了这项技术。
5.2
内容安全策略
内容安全策略是一个Mozilla计划,该计划向web开发人员提供了一种网站上可指定互动内容的方法,它在firefox3.7中的部署已经被提上了日程。和x-frame-options一样,策略通过HTTP响应头传送,它比x-frame-options更为通用,允许网站的所有者指定其他类型的内容互动,例如:它允许网站将脚本限制在特定的来源。
Web管理者可直接使用指定的frame-ancestors指令来指定那些来源能够被嵌入到frame或者iframe标签中去。因此不像x-frame-options,web管理者可指定允许的第三方网站嵌入到iframe中。CSP从x-frame-options的另外一些局限性中吃到了苦头。它并不提供一个强制的全局策略,到现在这个策略尚处于测试阶段还未被网站所使用。
5.3
使用javascript
到此x-frame-options或其他基于浏览器的防护手段被广泛使用,这使web站点几乎没有选择的余地只能使用javascript来对抗点击劫持。图7中所示的是目前我们认为最有效安全的framebusting代码
移除
点击此处添加图片说明文字
页面加载时,样式表会隐藏页面上的所有内容。
如果禁用JavaScript,页面将保持为空。 类似地,如果页面被框架,它将保持空白,否则将尝试破坏框架。
如果framebusting代码被阻止,如通过挂起卸载事件或进行204冲洗攻击,页面将保持为空。该脚本仅显示内容页面不在框架中运行的文档。
请注意,通过浏览器设置或NoScript禁用JavaScript的用户将无法使用该站点。 如果是这样的话,设计师可能想要有一个后备机制。
在我们的示例中,整个页面最初是不可见的,但是通过让子元素不可见,这种防御可能更加地细粒度。这样,如果禁用JavaScript,则可以向用户显示一条消息。 但是,不建议激活超出该简单消息的任何功能子集。
我们通过注入代码到顶部页面手工测试了一些负载重的站点。 使用Firefox的YSlow和Chrome的Speed Tracer,我们无法识别渲染或加载时间的任何显着降低
我们强调,这个代码没有被证明是框架破坏的一种安全方法。
正如我们在整篇文章中所展示的,许多错误和漏洞可用于攻击者定位JavaScript framebusting,并且可能还有更多。
我们的代码片段可能已经很容易受到未知攻击的影响。但据我们所知,这是当前最好的方法。
06
相关工作
第一次提到透明iframe的负面影响是2002年MozzilaFirefox浏览器的错误报告[21]。术语“劫持”[10]是由Hansen和Grossman在2008年创造的。Clickjacking与网络钓鱼[9]不同,因为它不会诱使用户将机密凭证输入假冒网站。相反,用户必须将其凭据输入真实的站点以建立认证会话。攻击能够持续到用户的会话过期。劫持可以被认为是混淆代理的一个实例[5]。
“混淆代理”一词是1988年由哈迪创造的[11]。另一个网络上的混淆代理问题的例子是跨站点请求伪造[2]。网络密钥认证方案[6]在URL中使用不可预知的秘密,而不是cookie进行身份验证。这种方法可以减轻混淆代理的问题,如劫持和CSRF。用于点击劫持的实验客户端防御包括ClearClick
[18]和ClickIDS
[1]。这些防御还没有广泛部署,所以他们不能作为网站主要的防御。他们还介绍了陈旧网站的一些兼容性成本,这可能会妨碍浏览器厂商的采用。
07
结论
我们调查了top500网站的framebusting的做法。 通过使用已知和新颖的攻击技术,我们发现我们遇到的所有劫持防御都可以以某种方式绕过。
许多攻击是通用的,可以用于攻击各种各样的站点。我们发现使用有针对性的攻击可以击败具有高级劫持防御(如Facebook和MySpace)的站点。在查看了可用的防御措施后,我们提出了一种基于JavaScript的防御方式,直到浏览器支持X-FRAME-OPTIONS等解决方案得到广泛部署。
本文由 看雪翻译小组 wangrin 编译,来源Stanford Web Security Research
完~
如果你喜欢的话,不要忘记点个赞哦!