跨域总结

最近在挖携程的SRC,因为看到携程的跨域都是基于CORS的,加上以前自己挖掘的jsonp相关的漏洞,所以在这里总结一下我的理解。

浏览器的”同源策略”

同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,
它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。
所谓同源是指”协议+域名+端口”三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

跨域是什么

一个域下的文档或脚本试图去请求另一个域下的资源,常见的就是跨域去请求资源取得其数据内容。

不受到同源策略限制的标签

1
2
3
4
5
6
7
8
9
10
<script src="..."></script>
<img src="...">
<video src="..."></video>
<audio src="..."></audio>
<embed src="...">
<frame src="...">
<iframe src="..."></iframe>
<link rel="stylesheet" href="...">
<applet code="..."></applet>
<object data="..." ></object>

所遇到的浏览器的一些限制

  1. 通过script img等标签引入外部js进行XSS攻击时,外部资源必须跟当前站点所使用的协议一致(https就对应https,http就对应http)
  2. 同源策略的限制
  3. 浏览器的XSS Auditor

了解常见的两种跨域机制

JSONP

JSONP的本质是绕过AJAX获取资源的机制,使用原始的src属性获取异域资源

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP Hijacking</title>
</head>
<body>
<script type="text/javascript">
function callbackFunction(result)
{
alert(result.name);
}
</script>
<script type="text/javascript" src="http://127.0.0.1/test/getUser.php?jsoncallback=callbackFunction"></script>
</body>
</html>

CORS

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

只要同时满足以下两大条件,就属于简单请求。

(1) 请求方法是以下三种方法之一:

1
2
3
HEAD
GET
POST

(2)HTTP的头信息不超出以下几种字段:

1
2
3
4
5
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

凡是不同时满足上面两个条件,就属于非简单请求。

浏览器对这两种请求的处理,是不一样的。

简单请求时,浏览器会直接发送跨域请求,并在请求头中携带Origin 的header,表明这是一个跨域的请求。
服务器端接到请求后,会根据自己的跨域规则,通过Access-Control-Allow-Origin和Access-Control-Allow-Methods响应头,来返回验证结果。
如果验证成功,则会直接返回访问的资源内容。

非简单请求时,浏览器并不会立即执行对应的请求代码,而是会先发送Preflighted requests(预先验证请求),
Preflighted requests是一个OPTION请求,用于询问要被跨域访问的服务器,
是否允许当前域名下的页面发送跨域的请求。OPTIONS请求头部中会包含以下头部:
Origin、Access-Control-Request-Method、Access-Control-Request-Headers。
服务器收到OPTIONS请求后,设置Access-Control-Allow-Origin、Access-Control-Allow-Method、Access-Control-Allow-Headers头部与浏览器沟通来判断是否允许这个请求。
如果Preflighted requests验证通过,浏览器才会发送真正的跨域请求。

CORS与JSONP的使用目的相同,但是比JSONP更强大。

JSONP只支持GET请求,CORS支持所有类型的HTTP请求。
JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

同源策略下的限制

CSRF (CSRF只需要发送请求,而不在乎返回数据)

  1. GET型CSRF 可以
  2. 一般POST型CSRF 可以
  3. 简单的CORS请求(我理解应该是包括了上面的GET型和一般POST型) 可以
    (不需要option请求,浏览器直接会发送请求)
  4. 复杂的CORS请求(例如json型POST请求) 不可以
    (由于复杂CORS,需要先进行option请求,验证通过后才会进行由浏览器进行数据请求,同源策略限制ajax不能读取返回内容,验证也就不会成功)

跨域获取数据

  1. GET请求数据获取 不可以 (同源限制ajax不能读取返回内容,jsonp是利用script标签)
  2. POST请求数据获取 不可以 (同源限制ajax不能读取返回内容制)

利用XSS

绕过同源策略限制:复杂的CORS请求 可以(XSS可以使得当前的origin是同源)
绕过CSRF的referer

浏览器的xss audit

浏览器的xss audit 是通过检测url和返回内容是否都有危险内容才拦截的,
例如访问http://www.baidu.com/#script#alert(1);#script#,这样因为返回内容没有危险,所以不会拦截,
同理,有些反射型XSS 的参数经过几次请求,才最终进入页面执行成功,这样也是不会拦截的(某些时候这样的反射型xss真的很好用)

1
2
3
<svg width=12cm height=9cm><a><image 
href=//brutelogic.com.br/yt.jpg /><animate attributeName=href
values=javas&#99ript:alert(1)>
web安全