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,即對任何不存在的路徑都不應等效為對有效父路徑的的請求。