當前位置:
首頁 > 知識 > Web緩存投毒實戰

Web緩存投毒實戰

Web緩存投毒實戰

摘要

Web緩存投毒一直是一個難以捉摸的漏洞,是一種「理論上」存在,可嚇唬開發人員去乖乖修補,但任何人無法實際利用的問題。

在本文中,我將向您展示,如何通過使用深奧的網路功能將其緩存轉換為漏洞並利用傳送系統來破壞網站,受眾是任何能在請求訪問其主頁過程中製造錯誤的人。

我將通過漏洞來說明和開發這種技術。這些漏洞使我能夠控制眾多流行的網站和框架,從簡單的單一請求攻擊發展到劫持JavaScript,跨越緩存層,顛覆社交媒體和誤導雲服務的複雜漏洞利用鏈。我將討論防禦緩存投毒的問題,並發布推動該研究開源的Burp Suite社區擴展。

這篇文章也會作為 可列印的pdf 文件提供,點擊閱讀原文獲取。

核心概念

緩存101

要掌握緩存投毒,我們需要快速了解緩存的基本原理。Web緩存位於用戶和應用程序伺服器之間,用於保存和提供某些響應的副本。在下圖中,我們可以看到三個用戶接連獲取相同的資源:

Web緩存投毒實戰

緩存旨在通過減少延遲來加速頁面載入,還可以減少應用程序伺服器上的負載。一些公司使用類似Varnish的軟體來託管他們的緩存,而其他公司選擇依賴Cloudflare這樣的內容交付網路(CDN),將緩存分散在各個地理位置。此外,一些流行的Web應用程序和框架(如Drupal)具有內置緩存功能。

還有其他類型的緩存,例如客戶端瀏覽器緩存和DNS緩存,但它們不是本文的研究重點。

緩存鍵

緩存的概念可能聽起來簡潔明了,但它隱藏了一些風險。每當緩存收到對資源的請求時,它需要確定它是否已經保存了這個確切資源的副本,並且可以使用該副本進行回復,或者是否需要將請求轉發給應用程序伺服器。

確定兩個請求是否正在嘗試載入相同的資源可能很棘手; 通過請求逐位元組匹配的方法是完全無效的,因為HTTP請求充滿了無關緊要的數據,例如瀏覽器發出的請求:

Web緩存投毒實戰

緩存使用緩存鍵來標識一個資源,緩存鍵一般由請求中的一部分內容組成。在上面的請求中,緩存鍵中包含的值用橙色突出顯示,這個緩存鍵是非常常用的。

這意味著緩存認為以下兩個請求是等效的,並使用從第一個請求緩存的響應來響應第二個請求:

Web緩存投毒實戰

Web緩存投毒實戰

因此,該頁面將錯誤的語言格式提供給第二位訪問者。這暗示了一個問題 ——任何非緩存鍵內容的差異,都可能被存儲並提供給其他用戶。理論上,站點可以使用「Vary」響應頭來指定請求頭中哪些部分應該作為緩存鍵。在實際中,Vary協議頭很少使用,像Cloudflare這樣的CDN甚至完全忽略它,人們甚至沒有意識到他們的應用程序支持基於任何協議頭的輸入。

這會導致許多意想不到的破壞,特別是當有人故意開始利用它時,它的危害才會真正開始體現

緩存投毒

Web緩存投毒的目的是發送導致有危害響應的請求,該響應將保存在緩存中並提供給其他用戶。

Web緩存投毒實戰

在本文中,我們將使用非緩存鍵部分的輸入(如HTTP請求)來使緩存中毒。當然,這不是緩存投毒的唯一方法 (您也可以使用HTTP響應拆分和 請求走私 的方法),但我自認為自己的方法最好。請注意,不要混淆Web緩存投毒與 Web 緩存欺騙,它們是不同類型的攻擊。

方法

我們將使用以下方法查找緩存投毒漏洞:

Web緩存投毒實戰

我並不想深入解釋這一點,下面將快速概述再演示它如何應用於真實的網站。

第一步:識別非緩存鍵部分的輸入。手動執行此操作非常繁瑣,因此我開發了一個名為Param Miner的開源Burp Suite擴展,通過猜測header/cookie的名稱來自動執行這些步驟,並觀察它們是否對應用程序的響應產生影響。

找到非緩存鍵部分的輸入後,接下來的步驟是評估您可以對它做多少破壞,然後嘗試將其存儲在緩存中。如果失敗,則您需要更好地了解緩存的工作方式,並且在重試之前,搜索可緩存的目標頁面。然而頁面是否被高速緩存基於多種因素,包括文件擴展名,內容類型,路由,狀態代碼和響應頭。

緩存的響應可能會忽略你的輸入,因此如果您嘗試手動檢測非緩存鍵部分,則「破壞緩存」是很重要的。如果載入了Param Miner,就可以通過向查詢字元串添加值為$ randomplz的參數,確保每個請求都具有唯一的緩存鍵。

檢測實時網站時,因為緩存響應而意外的使其他訪問者中毒是一種永久性危害。Param Miner通過向來自Burp的所有出站請求添加「破壞緩存」來緩解這種情況。此緩存共享器具有固定值,因此您可以自己觀察緩存行為,而不會影響其他用戶。

實例探究

讓我們來看看該方法應用於真實網站時會發生什麼。像往常一樣,我只針對對研究人員具有友好安全策略的網站。這裡討論的所有漏洞都已被報告和修補,但由於「私人」需要,我被迫編寫了一些漏洞利用程序。

其中許多案例研究在非緩存鍵部分的輸入中利用了XSS等輔助漏洞,重要的是要記住,如果沒有緩存投毒,這些漏洞是無用的,因為沒有可靠的方法強制其他用戶在跨域請求上發送自定義協議頭。它們因此容易被找到。


英文原文:https://portswigger.net/blog/practical-web-cache-poisoning
譯者:盈韜

未完,接本日推送第二篇

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

為什麼永遠不會有另一個RedHat:開源經濟學

TAG:Python部落 |