CORS漏洞学习
字数 1621 2025-08-19 12:42:32
CORS漏洞全面解析与防御指南
一、CORS基础概念
CORS(Cross-Origin Resource Sharing)是一种Web安全机制,用于控制浏览器中一个网页访问来自不同源(域名、协议或端口)资源的能力。CORS漏洞源于服务器配置不当,可能导致敏感信息泄露。
同源策略(Same-Origin Policy)
- 定义:限制不同源之间的交互,防止恶意网站通过跨域请求获取用户敏感信息
- 同源判定标准:协议、域名和端口完全相同
- 限制行为:
- 跨域请求无法访问目标网站的Cookie、LocalStorage和IndexDB
- 跨域请求无法获取目标网站的DOM元素
- 跨域请求无法直接发送AJAX请求
二、CORS漏洞原理与利用条件
漏洞原理
当服务器未正确配置CORS规则时,攻击者可通过恶意网站的JavaScript代码,利用用户已登录受害网站的凭据,发送跨域请求获取敏感信息。
利用前提条件
- 服务器配置不当:
Access-Control-Allow-Origin设置为通配符(*)或可被绕过Access-Control-Allow-Credentials设置为true
- Cookie设置宽松:
SameSite属性设置为None(需同时设置Secure属性,即HTTPS协议)
三、CORS漏洞四种典型场景
场景一:宽松的CORS配置
- 漏洞配置:
header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Credentials: true'); - 攻击方式:
攻击者网站(b.com)直接通过AJAX请求受害网站(a.com)的敏感接口 - 防御措施:
严格限制Access-Control-Allow-Origin为可信源
场景二:不严格的源校验
- 常见错误校验方式:
- 前缀校验(检测是否以a.com结尾) → 可被
a.com.b.com绕过 - 后缀校验(检测是否以a.com开头) → 可被
xxxa.com绕过 - 包含校验(检测是否包含a.com) → 可被
xxxa.com绕过
- 前缀校验(检测是否以a.com结尾) → 可被
- 防御措施:
使用严格的正则匹配或白名单机制
场景三:子域名XSS结合利用
- 利用条件:
- 主站严格限制CORS为子域名
- 某个子域名存在XSS漏洞
- 攻击方式:
通过XSS在子域名植入JavaScript,发送跨域请求获取主站数据 - 防御措施:
- 修复子域名XSS漏洞
- 实施严格的CSP策略
场景四:Origin为null的利用
- 漏洞配置:
header('Access-Control-Allow-Origin: null'); header('Access-Control-Allow-Credentials: true'); - 攻击方式:
使用iframe的sandbox属性构造Origin为null的请求:<iframe sandbox="allow-scripts" src='data:text/html,<script>...攻击代码...</script>'> - 防御措施:
禁止在生产环境信任null源
四、SameSite Cookie属性详解
SameSite属性控制是否随跨站点请求发送cookie,提供CSRF防护:
| 属性值 | 含义 |
|---|---|
| Strict | Cookie只能在第一方环境中发送 |
| Lax (默认) | 不发送跨站点请求(如img/iframe),但允许导航请求(如点击链接) |
| None | 允许跨站点和同站点请求发送cookie(必须设置Secure属性) |
安全建议:对敏感操作使用Strict,一般会话可使用Lax
五、防御措施总结
-
严格限制允许的源:
- 避免使用通配符(*)
- 使用白名单机制
- 避免不完整的前缀/后缀匹配
-
谨慎使用凭据:
- 除非必要,不要设置
Access-Control-Allow-Credentials: true - 结合SameSite属性强化Cookie安全
- 除非必要,不要设置
-
生产环境配置:
- 禁止信任null源
- 移除调试配置后再上线
-
其他安全措施:
- 实施CSRF令牌
- 设置合适的CSP策略
- 定期安全审计
六、示例代码分析
漏洞代码示例
// 不安全的CORS配置
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Credentials: true');
// 不安全的SameSite配置
ini_set('session.cookie_secure', "1");
ini_set('session.cookie_samesite', 'None');
安全配置示例
// 安全的CORS配置
$allowed_origins = ['https://trusted.example.com', 'https://subdomain.example.com'];
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
if (in_array($origin, $allowed_origins)) {
header("Access-Control-Allow-Origin: $origin");
header('Access-Control-Allow-Credentials: true');
} else {
header('HTTP/1.1 403 Forbidden');
exit;
}
// 安全的Cookie配置
ini_set('session.cookie_secure', "1");
ini_set('session.cookie_samesite', 'Lax'); // 或 'Strict' 对于敏感操作
七、相关资源
- MDN CORS文档
- SameSite属性详解
- OWASP CORS安全指南
通过全面理解CORS机制及其潜在漏洞,开发人员可以更安全地配置跨域资源共享,有效防止信息泄露等安全问题。