在开展任何安全评估之前,请先确认你已获得目标系统的书面授权。本文所有示例均使用占位域名与虚构环境,旨在演示核验思路与判断方法,请勿对未授权的系统执行任何测试。CORS(跨域资源共享)配置核验属于 Web 应用安全测试中的常见环节,其核心不在于“能否利用”,而在于“能否在受控条件下证明风险存在并给出可落地的修复方向”。下面我们按“配置探测—风险验证—影响评估—整改复测”四个阶段展开。
测试前置条件与安全边界
在开始之前,你需要明确三件事:测试范围、测试账号与停止红线。测试范围应精确到域名、路径与接口,避免越界触碰未授权的子域或第三方服务。测试账号建议使用专用低权限账号,避免使用生产环境的高权限凭证。停止红线包括但不限于:任何可能修改数据的请求、任何可能触发锁定的尝试、任何超出只读验证范畴的操作。CORS 核验本质上属于配置审计,绝大多数验证步骤都可以通过无害的 HTTP 请求完成,不需要也不应该发起带有副作用的请求。
阶段一:配置探测——识别 CORS 策略的存在与形态
CORS 策略通过响应头体现,最常见的三个响应头是 Access-Control-Allow-Origin(简称 ACAO)、Access-Control-Allow-Credentials(简称 ACAC)和 Access-Control-Allow-Methods。第一步是确认目标是否启用了 CORS,以及当前的策略形态。
使用 curl 或 Burp Suite 发送一个携带自定义 Origin 头的 GET 请求,观察响应头中是否出现 ACAO。例如:
curl -i -H "Origin: https://evil.example.com" https://api.target.example.com/user/profile
如果响应中出现 Access-Control-Allow-Origin: https://evil.example.com,说明服务器反射了请求中的 Origin 头,这是最直接的配置缺陷信号。如果响应中出现 Access-Control-Allow-Origin: *,则需要进一步检查是否同时存在 Access-Control-Allow-Credentials: true——这两者组合在浏览器层面是禁止的,但部分服务器配置错误会导致两者同时出现,属于高危配置。
除了直接反射和通配符,还要留意“前缀匹配”和“后缀匹配”两类不严谨的白名单逻辑。例如,服务器可能将 https://evil.example.com 判定为合法,因为其域名以 example.com 结尾;或者将 https://example.com.evil.com 判定为合法,因为其包含了 example.com 字样。这些都需要通过构造不同形态的 Origin 来逐一验证。
阶段二:风险验证——区分无害配置与可利用缺陷
探测到 ACAO 反射后,并不能直接判定为漏洞。关键在于两个条件的组合:Origin 是否被反射,以及是否允许携带凭证。只有两个条件同时满足,才构成可被攻击者利用的凭证泄露风险。
验证反射的边界
构造一组 Origin 测试用例,观察服务器的反射行为:
| Origin 请求值 | 期望的安全行为 | 风险行为 |
|---|---|---|
https://evil.example.com | 不反射或返回固定白名单 | 原样反射 |
https://example.com.evil.com | 不反射 | 反射(后缀匹配缺陷) |
https://evilexample.com | 不反射 | 反射(前缀匹配缺陷) |
null | 不反射 | 反射(null Origin 特殊处理) |
null Origin 是一个容易被忽视的测试点。某些应用在重定向、跨域 iframe 或本地文件场景下会发送 Origin: null,如果服务器无条件反射 null 并允许凭证,攻击者可以通过 iframe sandbox 属性构造出 null Origin 的请求,从而绕过基于域名白名单的防护。
验证凭证组合
在确认 Origin 反射后,检查响应头中是否包含 Access-Control-Allow-Credentials: true。如果存在,说明服务器允许跨域请求携带 Cookie、Authorization 头或 TLS 客户端证书。此时需要进一步确认目标接口是否依赖这些凭证进行身份识别。如果接口本身是无状态公开数据,即使 CORS 配置宽松,实际影响也有限;反之,如果接口返回用户个人信息、订单记录或内部配置,则风险显著。
非侵入式 PoC 构造
验证阶段不一定要真正发起跨域攻击。一个非侵入式的做法是:在本地搭建一个简单的 HTML 页面,通过 JavaScript 发起跨域请求,观察浏览器控制台的报错信息。如果请求被浏览器拦截,说明 CORS 策略生效;如果请求成功并返回数据,说明存在可利用的配置缺陷。这个过程不会对目标服务器产生额外压力,也不会修改任何数据。
更进一步的验证可以构造一个仅包含读取逻辑的 PoC 页面,例如:
<script>
fetch('https://api.target.example.com/user/profile', {credentials: 'include'})
.then(r => r.json())
.then(d => document.body.textContent = JSON.stringify(d))
.catch(e => document.body.textContent = 'Blocked: ' + e.message);
</script>
将这个页面托管在你自己的域名下,用浏览器访问,观察是否能够读取到目标接口的响应。如果能够读取,说明攻击者可以构造类似的恶意页面,诱导已登录用户访问,从而窃取其敏感数据。

阶段三:影响评估——从配置缺陷到业务风险
确认 CORS 配置缺陷后,需要评估其实际影响范围,而不是直接定性为“严重漏洞”。影响评估应围绕以下三个维度展开:
数据敏感度。 目标接口返回的数据类型决定了风险等级。公开的静态资源、无用户关联的配置信息,即使 CORS 配置错误,实际危害也有限;而包含个人身份信息、金融数据、会话令牌或内部 API 密钥的接口,则属于高价值目标。
凭证机制。 如果应用使用 Cookie 进行会话管理,且未设置 SameSite 属性或设置为 SameSite=None,则跨域请求会携带凭证,风险显著升高。如果应用使用 Token 认证且 Token 存储在 localStorage 中,CORS 配置错误的影响相对有限,因为跨域请求无法自动附带 localStorage 中的数据——但这并不意味着可以忽视,攻击者仍可能通过其他方式诱导用户手动输入或配合 XSS 利用。
攻击场景可行性。 考虑攻击者能否构造一个足够可信的诱导页面。如果目标应用的用户群体为内部员工,攻击者可能需要先获取内部网络访问权限;如果目标应用面向公众,攻击者只需在任意域名托管恶意页面并通过社交工程诱导用户访问即可。攻击可行性越高,风险等级越高。
在评估过程中,建议记录以下证据:请求与响应的完整 HTTP 头、测试时间、测试账号、构造的 PoC 页面 URL、浏览器控制台截图。这些证据将用于报告撰写与复测比对。
阶段四:整改建议与复测验证
CORS 配置的修复方向相对明确,但需要结合业务实际选择合适方案。
首选方案:白名单化。 将 ACAO 设置为固定的、经过严格校验的允许来源列表,而非反射请求中的 Origin。注意白名单匹配应使用精确匹配或完整的域名后缀匹配(如 https://app.example.com),避免使用子串匹配。同时,仅对确实需要跨域访问的接口启用 CORS,不需要跨域的接口应移除 CORS 响应头。
凭证安全。 如果接口确实需要支持跨域凭证请求,必须确保 ACAO 不是 *,且 ACAC 为 true 时 ACAO 必须为具体来源。建议同时配置 Vary: Origin 响应头,避免缓存服务器将针对特定 Origin 的响应错误地返回给其他来源。
纵深防御。 不要依赖 CORS 作为唯一防线。即使 CORS 配置正确,也应确保接口本身具备完善的鉴权与授权机制,避免越权访问。同时建议配置 Cross-Origin-Resource-Policy(CORP)和 Cross-Origin-Opener-Policy(COOP)响应头,形成多层跨域防护。
修复完成后,需进行复测。复测应重新执行阶段一和阶段二的验证流程,确认以下事项:攻击者构造的恶意 Origin 不再被反射;携带凭证的跨域请求被浏览器拦截;合法业务来源的跨域请求仍然正常工作。复测通过后,将修复前后的响应头对比、复测时间与结果一并归档至测试报告。

报告与归档要点
一份合格的 CORS 测试报告应包含以下字段:漏洞名称(如“CORS 配置不当导致凭证泄露风险”)、受影响 URL、漏洞类型(反射 Origin / 通配符 + 凭证 / 白名单绕过)、风险等级(建议结合数据敏感度与攻击可行性综合评定)、复现步骤(包含完整请求与响应头)、影响描述、修复建议、复测结果。报告中的复现步骤应确保其他测试人员能够按图索骥,独立复现相同结果。
CORS 配置核验的价值不在于发现一个“能弹 Cookie 的接口”,而在于帮助团队理解跨域信任边界的薄弱环节,并推动形成可复用的安全配置基线。每一次核验都应留下可追溯的证据,为后续的持续安全评估提供参照。
- it2021
- it2021.com
- 安全测试
- 应用安全
- 应用安全测试

1F
null Origin这个点平时确实容易漏掉