本篇文章主要講解一下跨域攻擊:
- Jsonp劫持
- Flash跨域劫持
- CORS跨域資源獲取
----------------------------------------
Jsonp劫持
Jsonp在2016年就出現了,由於造成危害大多就是泄露敏感信息,比如用戶信息,token等,遠不如SQL注入,命令執行這些漏洞來的徹底,所以總是被人忽視。Jsonp劫持攻擊又稱為 "JSON Hijacking",攻擊過程類似於csrf,只不過csrf只管發送http請求,但是Json-hijack的目的是獲取敏感數據。
而Jsonp(JSON with Padding)是json的一種"使用模式",可以讓網頁從別的域名(網站)那獲取資料,即跨域讀取數據。
Jsonp劫持具體講解與利用
知道創宇 : JSONP安全攻防技術
Jsonp劫持漏洞挖掘
有很多程序員在寫接口的時候都會順手寫個jsonp的接口,可以先開着burp看一下功能點,看看是否有地方用了jsonp
快速尋找Jsonp的接口
開着bp逛一圈,一般有jsonp的數據傳輸會在mimetype中顯示為script,通過排序可以快速得找到
callback的值,就是jsonp回傳回來的函數名
然后只要查看傳輸的數據中是否有敏感信息就可以了
尋找敏感的Json數據
如果jsonp的接口沒有敏感信息傳輸,json數據包中恰好有的話,我們可以嘗試一下程序員是否有開發jsonp的格式,大多數程序員喜歡把jsonp的回傳參數命名為callback
當然還有其他的可能,貼一份字典,直接用Intruder Fuzz一下試試:
callback=attack cb=attack call=attack jsonp=attack jsonpcallback=attack jsonpcb=attack json=attack jsoncallback=attack jcb=attack
漏洞證明
如果最后爆破成功的接口為
http://www.xxx.com/interface?callback=attack
返回的數據為
attack({"value":1})
使用下面的poc:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsonp劫持</title>
<script src="js/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript"> $.ajax({ url:"http://xxx.com/interface", dataType:"jsonp", jsonp:"callback", jsonpCallback:"attack", success:function (data) { alert(data.value) } }) </script>
</body>
</html>
jsonp 填寫回調參數的名字
jsonpcallback 就是回調參數的值
alert 的地方根據需要更改取值
如果能正常取到值,就說明漏洞存在了
漏洞利用:
這里來看一條請求:
這條請求返回的結果中有手機號(這里我測試的賬號沒綁定手機),如果我們想要以CSRF交互式攻擊的方式獲取這個手機號該怎么辦?
來看看這條請求有callback,而返回結果是不是類似Javascript中的函數?
Javascript原函數定義如下:
function funName(){}
這里是缺少了函數定義的關鍵詞function和花括號的函數主體部分,只有函數名和函數傳參,聰明人已經想到了,這不就相當於是自定義函數被引用了么,而中間那段傳參就相當於是一個數組,所以我們可以先用JS自定義好這個函數,然后再引用這個請求,自然就可以獲取到數據了。
這時候我們可以來構建一下PoC:
<!-- 引用一段如上請求為JS -->
<script>function jsonp2(data){alert(JSON.stringify(data));}</script>
<script src="http://gh0st.cn/user/center?callback=jsonp2"></script>
使用正常的賬號(綁定過手機號)來測試下:
其他漏洞案例參照烏雲:蘇寧易購多接口問題可泄露用戶姓名、地址、訂單商品(jsonp案例)
-------------------------------------------
Flash跨域劫持
首先分享三個參考資料:
盡管flash宣布不再維護,但是還有許多視頻站正在使用flash作為播放器,本為主要來學習flash跨域讀取漏洞
flash(swf)以宿主域出發(而不是使用域)判斷 是否為跨域請求。
A站上的flash文件 http://www.a.com/vul.swf,被B站 http://www.b.com/exp.htm 拿去使用。此時 vul.swf 請求a站上的資源是不需要提前獲取 http://www.a.com/crossdomain.xml 判斷是否有權限,反而vul.swf請求b站上的資源卻需要提前判斷是否有權限。這一點與js不同。
Flash跨域比較經典了,在做web目錄資產整理的時候有時候會發現這樣的文件 crossdomain.xml ,文件內容如果是如下的,那么就存在Flash跨域問題,如下內容的意思是支持所有域:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
為什么會如此?具體流程是這樣的:
gh0st.cn 有一個SWF文件,這個文件是想要獲取 vulkey.cn 的 userinfo 的返回響應主體,SWF首先會看在 vulkey.cn 的服務器目錄下有沒有 crossdoamin.xml 文件,如果沒有就會訪問不成功,如果有 crossdoamin.xml ,則會看crossdomain.xml 文件的內容里面是否設置了允許 gh0st.cn 域訪問,如果設置允許了,那么 gh0st.cn 的SWF文件就可以成功獲取到內容。所以要使Flash可以跨域傳輸數據,其關鍵就是crossdomain.xml 文件。
當你發現 crossdomain.xml 文件的內容為我如上所示的內容,那么就是存在Flash跨域劫持的。
漏洞案例
在對一個廠商進行測試的時候正好發現了這樣的文件:
在這里我需要做兩件事:
1.找到一個能獲取敏感信息的接口
2.構建PoC
在這里敏感的信息接口以個人中心為例子,PoC使用的是 :
其他漏洞案例:
------------------------------------------------
CORS跨域資源獲取
強烈建議先看一下 : 跨域資源共享CORS學習筆記
漏洞案例
如上圖中我在請求的時候加上了請求頭 Origin: http://gh0st.cn
,而對應的響應包中出現了 Access-Control-Allow-Origin: http://gh0st.cn
這個響應頭其實就是訪問控制允許,在這里是允許http://gh0st.cn的請求的,所以http://gh0st.cn是可以跨域讀取此網址的內容的~在這里我介紹下Origin
:
Origin
和Referer
很相似,就是將當前的請求參數刪除,僅剩下三元組(協議 主機 端口),標准的瀏覽器,會在每次請求中都帶上Origin
,至少在跨域操作時肯定攜帶(例如ajax的操作)。
所以要測試是否存在CORS這個問題就可以參考我上面的操作手法了。
怎么利用呢?在這里我使用了github上的開源項目:https://github.com/nccgroup/CrossSiteContentHijacking,readme.md中有具體的說明,這里我就不一一講解了,那么已經確認問題了,那就需要進一步的驗證。
在這里我找到了一處接口,其響應主體內容是獲取用戶的真實姓名、身份證、手機號等內容:
/daren/author/query (要注意的是這個請求在抓取的時候是POST請求方式,但並沒有請求正文,經過測試請求正文為任意內容即可)
響應報文正文內容:
這里CrossSiteContentHijacking項目我搭建在了本地(127.0.0.1) http://127.0.0.1/CrossSiteContentHijacking/ContentHijackingLoader.html
根據項目所說的操作去進行參數的配置,然后點擊 Retrieve Contents 按鈕:
測試如下,測試結果是可以跨域讀取的:
案例總結
這個問題其實就是對Origin的驗證沒有控制好,對其進行加強即可。