web漏洞挖掘指南-前端跨域漏洞
一.何為跨域
1.設想一種場景,一個惡意網站上嵌入了一個iframe標簽去加載銀行的登陸頁面,高度和寬度的設置和真實的銀行官網一樣,當用戶訪問惡意網站并登錄時,攻擊者就可以利用惡意腳本通過XMLHttpRequest之類的dom操作竊取用戶的銀行卡數據,為了防止防御此類攻擊,同源策略誕生了!
2.同源策略規定不同域的客戶端腳本如果沒有明確授權允許執行,不能讀寫另一方的資源。同協議,同端口,同主機名的兩個URL才能被認為同源。
3.隨著web應用前后端分離模式的流行,后端開發寫完業務功能的代碼后需要提供接口給前端用,而前后端域名往往是不一致的,這時請求就會被同源策略限制,為了更方便地共享這些的跨域資源,開發者們又設計出了CORS、jsonp等方式來完成跨域請求。
二、跨域請求發生的場景
1.其實除了前后端分離的場景需要實現跨域請求,也會有其他常見的場景要用到跨域請求:
2.某集團的非主營業務需要調用主站用戶的賬號信息,并將其數據顯示出來
3.某寶、某東需要從第三方物流公司調用運單詳情
4.本地開發程序時,本地文件夾不是在域名下面,要測試接口功能時可能需要發送ajax請求,這時也需要用到跨域請求
5.加載第三方網站上的圖片,css樣式,js等資源,有三個標簽可以直接跨域訪問這類資源:
<img>、<link>、<script>
三、CORS跨域漏洞
1.CORS,跨域資源共享(Cross-origin resource sharing),這種機制通過添加HTTP字段的方式規定服務器資源允許被哪些域訪問(Access-Control-Allow-Origin)、請求中是否允許發送cookie(Access-Control-Allow-Credentials)、哪些請求類型是被允許的(Access-Control-Request-Method)等等。
2.其中最為重要的是Access-Control-Allow-Origin標頭,當這一字段設置為 時表示服務器資源允許被任何域訪問,當然如果需要請求用戶信息這類的資源,cookie也是必須帶上的,所以Access-Control-Allow-Credentials字段值要設置成true。但是當如果配置成Access-Control-Allow-Origin: Access-Control-Allow-Credentials: true ,這種會被瀏覽器默認禁止導致無法利用,最好利用的配置可以參考如下請求:

3.如果將Origin請求頭改為evil.cn,響應頭中有Access-Control-Allow-Origin頭,并允許evil.cn讀取cookie訪問服務器資源,這類配置往往是存在跨域配置錯誤且最好利用的。
4.綜上所述,不難發現CORS跨域漏洞出現的請求包特征,burp中可以自動添加Origin頭去尋找CORS配置錯誤,勾選如下默認配置→history中篩選帶有cors配置錯誤的特征即可:

5.當然,網上也有師傅寫了自動搜集CORS請求的burp插件,可以對history中的請求先做一個過濾,后續再做利用:
https://github.com/p1g3/JSONP-Hunter
使用方法可參考Tips:
https://zone.huoxian.cn/d/318-burpjsonpcors
xray也可以掃描這類漏洞,但是很少用xray去掃,因為很多cors請求讀取的并不是敏感信息,這類漏洞交到SRC大概率是要被忽略的,我們需要人工判斷響應數據中的數據是否足夠敏感,xray默認配置即可掃描CORS:

6.發現存在錯誤配置的CORS請求后,還需考慮請求是否有refer校驗,因為跨域漏洞的觸發和csrf是類似的,需要通過交互讓受害者訪問我們的惡意腳本,如果因為refer校驗不通過還需要進一步bypass。這也是大多數SRC讓提供有效poc的原因。js代碼編寫經驗較少的師傅可以用工具生成poc:
https://github.com/0verSp4ce/PoCBox
本地搭建好后在圖示處填入相關數據后即可生成poc code,可以選擇online test,也可以將poc code保存為html后本地訪問,驗證是否可以讀取響應數據:

四、jsonp跨域漏洞
1.相較CORS跨域而言,jsonp跨域算老方法了,瀏覽器兼容性比較好,他發送的不是ajax請求,而是利用了
2.從jsonp跨域的實現方式來看,其請求過程就不難理解了。服務器先封裝好一個回調函數,客戶端通過類似調用腳本的方式傳遞一個callback參數給服務端,來調用跨域服務器上動態生成的json后綴文件,服務端返回數據時會將這個callback參數作為函數名來包裹住json數據,這樣客戶端就可以通過函數名來獲取對應的數據了。
3.綜上所述,不難發現,jsonp跨域請求過程中,回調函數起著至關重要的作用,我們可以通過回調函數名的特征去尋找jsonp請求,如:callback,cb,jsonpCallback,jsonpcb等等。網上也有寫好的burp插件來完成jsonp請求收集的步驟:
https://github.com/p1g3/JSONP-Hunter/blob/master/Jsonp_Hunter.py
使用參考Tips:
https://zone.huoxian.cn/d/318-burpjsonpcors
圖示處可自定義回調函數名等特征:

4.jsonp請求如果沒有用refer進行限制,是可以被用來劫持的,同樣可以用PoCBox生成POC進行漏洞驗證和利用,以下為利用jsonp讀取用戶信息實例:接口地址:
http://xxx/user/getUserInfo?callback=jQuery224001622079386685593_1628667945545&uid=xxx

5.online test:

五、前端跨域漏洞與CSRF的區別
1.剛開始學跨域漏洞時,我也會有同樣的疑問,網上對于同源策略限制的解釋眾說紛紜,有的說SOP是用來防XSS和CSRF的,當然更多的是說限制跨域請求的,基于安全考慮,當前域不能訪問其他域的資源。那么同源策略到底能不能防止CSRF呢?
2.說說我的個人看法:說到底,同源策略只是一種限制策略,并不是禁止請求,如果有惡意腳本請求了跨域資源,那么同源策略會攔截掉響應數據,讓其無法對數據進行讀取。然而,csrf漏洞的本質其實是偽裝成受害者去完成請求,能不能讀取返回數據并不重要。如果這樣說很難理解,也可以結合漏洞場景來看:
3.常見跨域漏洞的請求:讀取用戶信息、調用第三方平臺數據。
4.常見CSRF漏洞的請求:密碼重置、修改用戶信息、銀行轉賬。