Web快取欺騙/中毒(Deception/Poisoning)漏洞挖掘及實戰案例全匯總
- 2019 年 10 月 10 日
- 筆記
1、漏洞理解
1)web快取機制
當下很多web系統使用web快取功能來存儲一些經常檢索的文件,以減少Web伺服器響應的延遲和減輕伺服器上的負載。常見的快取內容往往是靜態或公共文件:樣式表(css),腳本(js),文本文件(txt),影像(png,bmp,gif)等。
如圖,當一個用戶第一次訪問了文件,就會被快取,下一次當有任何一個其他客戶端請求該文件時,快取機制由於已經存儲了這個文件,會把快取的文件內容發送給客戶端而不需要去請求Web伺服器,這樣就減輕了伺服器負載。

快取通常通過CDN,負載均衡器或簡單的反向代理來實現:
A)CND(內容分發網路):代理的分散式網路,目的是快速地提供內容。客戶端將由一組離它最近的代理伺服器提供服務。
B)負載均衡:除了平衡多個伺服器之間的通訊量外,負載均衡還可以快取內容,以減少伺服器的延遲。
C)反向代理:代理伺服器代表客戶端從web伺服器檢索資源,同時可以快取web應用程式的一些內容
2)Web快取欺騙
Web快取欺騙(Web Cache Deception)是一種新的Web攻擊向量,在2017年第一次被Omer Gil提出(閱讀原文)。它的漏洞原理和RPO (Relative Path Overwrite)相對路徑覆蓋漏洞較為類似,根因都在於瀏覽器和網路伺服器對相同URL請求的解析不一致(寬位元組、00截斷也是)。通過「欺騙」用戶訪問一個不存在的靜態頁面,從而使敏感頁面保存在快取中,從而竊取用戶敏感資訊,通常是用戶個人資訊、業務敏感數據等,如果響應的主體中包含了用戶的會話標識符、CSRF令牌可進一步可導致ATO。
3)Web快取中毒
Web快取中毒(Web Cache Poisonning)和快取欺騙通常被混淆,它的攻擊方式是通過X-Forwarded-Host頭,發送導致有害響應的請求,該響應將保存在快取中並提供給其他用戶,其他用戶訪問到此頁面時將不是正常頁面,而是被攻擊者「中毒」之後的的頁面,產生的危害通常是XSS,也可能導致資訊泄露。

除了使用這個HTTP頭來破壞快取,還可以使用HTTP響應拆分(CRLF)和請求走私(RequestSmuggling)來完成攻擊,這幾個技術點後續補充。
2、漏洞原理
1)快取欺騙
如果代理伺服器設置為快取靜態文件,忽略這類文件的caching header時,對於url地址http://www.example.com/myaccount/包含用戶賬戶資訊。攻擊流程如下: 1)誘使用戶通過瀏覽器請求不存在的css文件:http://www.example.com/myaccount/no-existent.css ;
2)由於伺服器無法解析css文件,只能解析到myaccount/,所以返回myaccount/的內容。
3)此時響應經過反向代理伺服器Nginx;
4)代理識別該文件有css後綴,在快取目錄下,代理伺服器創建目錄myaccount,將返回的內容作為 non-existent.css 保存;
5)攻擊者請求相同鏈接,將得到快取中的內容,即myaccount的敏感內容。

2)快取中毒
快取中毒的攻擊流程很簡單,最相像的漏洞利用是CORS,即在正常請求中添加X-Forwarded-Host頭,對於這個XFH頭的解釋:

發送請求,可以看到系統使用X-Forwarded-Host頭在元標記內生成OpenGraph URL:

很容易想到攻擊思路,構造xss:

此時,這個響應已經被保存到快取中,此時受害者正常請求此地址則會得到被中毒後的頁面,從而被遭到xss攻擊:

3、實戰案例
1) PayPal快取欺騙
原理講解中的真實案例,https://www.paypal.com/myaccount/home頁面返回的是用戶Omer賬戶資訊:

追加malicious3.css訪問不存在的資源,返回的依舊是原頁面,但此時快取中已經創建了名為home的目錄,裡面快取了此頁面:

打開一個新的瀏覽器(攻擊者),訪問此頁面,獲取到敏感頁面:

此漏洞同樣存在於Paypal的設置、歷史頁面等,Omer Gil因此被獎勵了$3000。
2) 404頁面快取敏感資訊
快取欺騙的一個特殊案例,在某些情況下我們請求一個不存在的靜態資源,返回404 error,雖然訪問不到當前的業務數據,但還是在系統框架中:

查看源,雖然session沒有被快取,但用戶資訊已經被快取:

3) Smule快取中毒利用
web快取中毒最常見的是攻擊效果是XSS,有時也可以達到用戶資訊泄露及賬戶接管的攻擊效果,如Smule請求端點
https://www.smule.com/s/smule_groups/user_groups/user_name,添加X-Forwarded-Hos頭為 localhost:

系統接受了這個頭並修改為頁面的跳轉鏈接,並將其保存至快取中:

受害者訪問此頁面,將使用上述鏈接進行登錄,請求變為:

攻擊者可在自己的伺服器上創建腳本,模仿web伺服器端響應包,從而竊取用戶CSRF token等敏感資訊。
4、漏洞挖掘
在挖掘web cache漏洞的時候首先要確定web系統架設了CDN,負載均衡器或反向代理等快取設備,其次觀察返回頭是否設置快取控制頭Cache Control:no-cache,max-age=0,private,no-store,若未設置則很大可能存在此漏洞。
當然即使存在快取標頭也要嘗試下,即使缺少快取頭,也不代表一定會獲得快取資訊攻擊。除此之外:
1)快取欺騙
此漏洞存在需要滿足兩個條件:
1)Web快取功能設置為通過URL的擴展名來判斷是否進行快取文件,且忽略任何快取頭。
2)當訪問類似
http://www.example.com/home.php/non-existent.css不存在的頁面,返回home.php 的內容而不是「頁面不存在」。
3)誘使訪問URL時,受害者必須已經經過身份驗證。
附帶一個自動挖掘工具:
https://github.com/arbazkiraak/web-cache-deception-checker
2)快取中毒
探測過程較簡單,添加X-Forwarded-Host頭觀察是否在返回包中回顯(通常是生成的鏈接link)。
5、漏洞防禦
防禦措施主要包括3點:
1)設置快取機制,僅僅快取httpcaching header允許的文件,推薦的防禦手段;
2)如果快取組件提供選項,設置為根據content-type進行快取;
3)訪問類似home.php/non-existent.css不存在的靜態頁面時候,不返回 home.php 的內容,而返回404或者302,即對任何不存在的路徑都不應等效為對有效父路徑的的請求。