本文为“小米安全中心”原创
原文地址:https://sec.xiaomi.com/article/17

本文主要介绍几种跨域获取数据的方法,比较基础,但是在跨站漏洞的挖掘和利用上会起到很大的帮助。下面根据个例子简单的把遇到的跨域总结下:

场景:
网站A获取网站B上的资源,需要跨域传输数据

两种情况:

测试环境:

我们这里设置简单点,为了下面的说明,统一设置到test.com域下,只是二级域名不相同。只要不设置document.domain,这样也不算是同域

hosts设置:

ip a.test.com

ip b.test.com

测试需求:

利用a站获取到b站的资源,首先看下同源策略是怎样保证请求数据的安全的。

首先采用直接使用iframe加载,直接使用js来获取数据

B站点要获取的data文件内容:

A站点获取数据html代码:

在chrome下访问A站的getB.html,出现

Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "http://a.test.com" from accessing a frame with origin "http://b.test.com". Protocols, domains, and ports must match.

同源策略直接进行了阻止,防止进行跨域操作。

很多时候会采用ajax去获取访问数据,下面是获取数据代码:

访问,看chrome下面的提示:

XMLHttpRequest cannot load http://b.test.com/data.html. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://a.test.com' is therefore not allowed access.

下面分两种情况实现跨域获取数据:

一、B站的资源是可控的

1.通过document.domain来控制

同主域名下iframe控制document.domain进行读取,修改data.html和getB.html内容增加域的设置:

document.domain=”test.com”

再次访问,成功获取到数据信息,这个是最简单的,大域是相同的,都是可以去利用的。其实所有的com网站,cn网站都是一个大域,不过现在浏览器拒绝了这样的请求

2.iframe结合location.hash进行跨域数据获取

B站下data文件:

主要是B站的data文件iframe加载proxy,hash获取到data数据,传递给proxy.html的hash中,proxy获取到hash传递给同源的A站

getB_byhash.html

主要是利用A站获取数据文件iframe加载B站的data文件,data文件又加载A站的proxy文件,proxy的hash中存有B站的数据,proxy和get文件同源,利用parent.parent两个父页面传递出hash

3.通过iframe.name跨域传递数据

B站的data文件为:

A站getB_byname.html的内容:

代码可以变得更简单点:

原理:

主要就是先iframe 加载数据页面,此时window.name传递给了iframe的name,在利用跳转到同源的页面下,输出数据。

4.json劫持

B站的data数据:

var data="I am from B site!!!"

A站的get代码:

5.html5中的postMessage

B站的data数据:

获取数据代码:

这个可以参考下呆子不开口的《对方不想说话并扔了个message》

6.CORS

主要就是通过设置相应头中的 Access-Control-Allow-Origin 字段。前面直接用ajax获取数据时候已经提示了。

Access-Control-Allow-Origin 响应字段说明了该资源或网站所允许被非同源站点访问的站点列表,当 Access-Control-Allow-Origin 中包含网站 A 或者设置为 * 时,网站 A 即可对网站 B 上的资源进行任意访问。

也就是利用ajax请求可以获取到数据信息的。

php文件:

设置 Access-Control-Allow-Origin 允许所有站点访问读取

get代码:

二、B站资源不可控

利用中间代理访问,方法利用php页面去访问数据页面获取到数据,在利用cors传递回来。

代理代码:

A站直接ajax请求proxy即可

源链接

Hacking more

...