您的位置:

跨域资源共享漏洞

一、跨域资源共享漏洞验证

跨域资源共享漏洞(Cross-Origin Resource Sharing, CORS)是由于浏览器的实现机制导致的,它的本质是浏览器允许网页上的JavaScript代码向跨域服务器发送HTTP请求,从而获取数据。但由此也带来了安全风险。

验证CORS是否存在漏洞的方法有很多,其中较常用的几种如下:

1. Burpsuite

使用Burpsuite可以抓取请求,然后进行修改,模拟跨域请求。如果跨域资源共享漏洞存在,我们就可以得到源站的信息和资源。

POST /login HTTP/1.1
Host: abc.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 23
Origin: http://www.xyz.com
Connection: close

name=admin&password=123

2. 自建跨域资源共享测试网站

可以自建一个测试网站,测试跨域请求有没有成功。例如,我们自建的跨域资源共享测试网站是http://www.cors-test.com/,其页面上为一个JavaScript链接,如果该域名允许跨域访问,即可正常打开JavaScript页面。

<html>
<head>
    <script src="http://www.cors-test.com/load-script.js">
    </script>
</head>
<body>
<p>Hello, World!</p>
</body>
</html>

3. 浏览器的开发者工具

通过开发者工具可以方便地查看HTTP请求和响应,并进行修改和添加。例如,可以使用Chrome的开发者工具,选择Network标签页,找到发送请求的地址,查看响应报文,如果 Access-Control-Allow-Origin 是 *,表示该站点存在 CORS 漏洞。

二、跨域资源共享漏洞修复

跨域资源共享漏洞的修复方法如下:

1. 同源策略

浏览器的同源策略禁止不同源网页间的 cookie、localStorage 和 IndexDB 等数据相互访问,而通过这些方式能够获取其他网页 valuable 的信息,可以减少攻击者对网页的攻击,防止一些不必要的资源泄露。

2. 服务器设置CORS

可以通过在响应头(Response Header)字段里设置 Access-Control-Allow-Origin,来令指定来源访问该资源,指定来源后将禁止其他来源对资源的访问,可以避免跨站请求攻击(CSRF)。例如,若网站http://www.abc.com允许http://www.xyz.com和http://www.klm.com进行跨域资源请求,则在www.abc.com的响应头中应增加如下内容:

Access-Control-Allow-Origin: http://www.xyz.com
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, *

3. 使用Token传递数据

使用Token传递数据是跨域访问的一种方案,Token是用户的身份令牌,可以直接翻看该身份令牌从而克服跨站请求攻击(CSRF)。

三、跨域资源共享CORS详解

1. CORS的类型

CORS请求分为两类:简单请求(Simple Request)和非简单请求(Non-simple Request)。

简单请求需同时满足以下四个条件:

  • 使用 HTTP 方法为:GET、HEAD 或 POST
  • Content-Type 为text/plain、multipart/form-data、application/x-www-form-urlencoded中的一种
  • 请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器
  • 请求中没有使用不安全的标头(如Cookie、Authorization等)或者是之前已经通过Access-Control-Allow-Headers设置了

非简单请求满足以下任意一个:

  • 使用PUT、DELETE方法,或者是使用其他请求方法,POST请求Content-Type不是text/plain、multipart/form-data、application/x.www.form-urlencoded之一
  • 请求中的任意 XMLHttpRequestUpload 对象均注册了事件监听器
  • 请求中使用了之前没有用过的自定义标头

2. CORS流程

CORS流程如下:

  1. 浏览器发现AJAX请求是跨源的,就会为该请求添加origin字段,标明来源,例如,origin: http://www.abc.com
  2. 服务器如果接受跨源请求,就需要在响应头中添加 Access-Control-Allow-Origin,指定允许的源,例如,Access-Control-Allow-Origin: http://*.xyz.com 表示允许以 xyz.com Qualified Name Label 结尾的任何请求跨源访问。如果要允许所有源访问该资源,则可以设置为 Access-Control-Allow-Origin:*
  3. 完成以上两步后,浏览器会对响应头进行检查,如果 origin 在 Access-Control-Allow-Origin 允许的列表中,就将响应返回给前端,否则便会停止请求,也就是将响应取消。

3. CORS的安全性

CORS通过在跨域请求时加入origin头,在服务器端进行判别,只有同意情况下才能发生跨域请求,避免了一些跨域危害。同时,设置 Access-Control-Allow-Origin 的时候千万不能设置为 *,这个时候服务器允许所有站点跨域请求,这将导致严重的安全问题。