參考bobao.#/learning/detail/4175.html
關于web緩存
一些靜態(tài)文件,如jpg汁讼、js、css文件會被中間的代理服務器緩存下來阔墩,減少響應延遲嘿架。
服務器響應
web緩存欺騙以來于瀏覽器以及web服務器的響應。當請求home.php/x.css與請求home.php的響應內(nèi)容相同時啸箫,緩存攻擊才有效耸彪。
web緩存欺騙方法
1、攻擊者誘使用戶訪問“https://www.bank.com/account.do/logo.png”忘苛。
2蝉娜、受害者的瀏覽器會請求“https://www.bank.com/account.do/logo.png”。
3扎唾、請求到達代理服務器召川,代理服務器沒有緩存過這個文件,因此會向web服務器發(fā)起請求胸遇。
4荧呐、Web服務器返回受害者的賬戶頁面,響應代碼為200 OK纸镊,表明該URL與已有頁面一致倍阐。
5、代理機制收到文件內(nèi)容逗威,識別出該URL的結尾為靜態(tài)文件擴展名(.png)峰搪。由于在代理服務器上已經(jīng)設置了對所有靜態(tài)文件進行緩存,并會忽略掉緩存頭部凯旭,因此偽造的.png文件就會被緩存下來概耻。與此同時使套,緩存目錄中會創(chuàng)建名為“account.do”的一個新的目錄,logo.png文件會緩存在這個目錄中咐蚯。
6童漩、用戶收到對應的賬戶頁面。
7春锋、攻擊者訪問“https://www.bank.com/account.do/logo.png”頁面矫膨。請求到達代理服務器,代理服務器會將已緩存的受害者賬戶頁面發(fā)給攻擊者的瀏覽器期奔。侧馅、
攻擊條件
1、訪問home.php/j.css與訪問home.php的響應內(nèi)容一致
2呐萌、Web應用啟用了Web緩存功能馁痴,并且會根據(jù)文件的擴展名來緩存,同時會忽略掉任何緩存頭部肺孤。
3罗晕、受害者在訪問惡意URL地址時必須已經(jīng)過認證。
現(xiàn)有的web框架
以下是幾種有效的存在web緩存欺騙的web框架
1赠堵、PHP
創(chuàng)建不使用任何框架的PHP WEB應用小渊,該應用匯忽略掉URL尾部的任何附加載荷,返回真實頁面的內(nèi)容茫叭。
2酬屉、Django
Django使用調(diào)度器(dispatcher)來處理Web請求,調(diào)度器使用urls文件來實現(xiàn)揍愁。在這些文件中呐萨,我們可以設置正則表達式來識別URI中具體請求的資源,然后返回對應的內(nèi)容莽囤。
因此谬擦,根據(jù)django這種常見配置,當客戶端請求http://www.sampleapp.com/inbox/”時烁登,服務器會返回Inbox頁面的內(nèi)容怯屉。如果將某個不存在的文件附加到該URL尾部(如“http://www.sampleapp.com/inbox/test.css”),這種正則表達式同樣會匹配成功饵沧。如果正則表達式尾部使用了“$”符锨络,那么就不會匹配這種惡意URL地址。
緩存機制
攻擊的第2個條件是web應用啟用了Web緩存功能狼牺,并且會根據(jù)文件的擴展名來緩存羡儿,同時會忽略掉任何緩存頭部。
1是钥、Cloudflare
不幸的是掠归,當訪問惡意URL地址時缅叠,web服務器會返回已有的動態(tài)頁面的緩存頭部,這意味著服務器很有可能會返回帶有“no-cache”指令的文件虏冻。
幸運的是肤粱,Cloudflare存在一個名為“邊緣緩存過期TTL(Edge
cache expire TTL)”的功能,這個功能可以用來覆蓋任何已有的頭部信息厨相。將該功能設置為啟用(on)狀態(tài)時领曼,服務器返回的帶有“no-cache”指令的文件仍會被緩存下來。出于各種原因蛮穿,在Cloudflare的建議下庶骄,該功能通常會處于啟用狀態(tài)。
2践磅、IIS ARR
應用程序請求路由(Application Request Routing单刁,ARR)模塊可以為IIS帶來負載均衡功能。
ARR模塊提供的一個功能就是緩存功能府适。Web服務器可以通過負載均衡器設置緩存規(guī)則羔飞,以便將文件保存到緩存目錄中。在創(chuàng)建新的緩存規(guī)則時檐春,使用通配符和目標擴展名來定義待緩存的文件類型褥傍。當文件經(jīng)過ARR處理時,ARR會根據(jù)文件對應的URL來匹配緩存規(guī)則喇聊。實際上,ARR會根據(jù)URL尾部的擴展名來識別文件類型蹦狂。
此外誓篱,IIS ARR中還包含一個選項,可以忽略掉文件的緩存頭部凯楔,導致該規(guī)則在任何情況下都適用窜骄。
如果客戶端訪問惡意URL(http://www.sampleapp.com/welcome.php/test.css),那么緩存目錄中就會生成一個新的目錄摆屯,目錄名為welcome.php邻遏,在該目錄中,會生成名為test.css的一個新的文件虐骑,該文件的內(nèi)容為用戶訪問的welcome.php頁面的內(nèi)容
3准验、Nginx
作為負載均衡服務器,NGINX服務器也可以提供緩存功能廷没,來緩存從web服務器返回的頁面糊饱。
可以通過NGINX配置文件來配置緩存規(guī)則。如果使用下圖所示的配置文件颠黎,那么NGINX就會緩存特定類型的靜態(tài)文件另锋,并且會忽略這些文件的緩存頭部滞项。
當來自于web服務器的某個頁面到達NGINX時,NGINX會搜索URL尾部的擴展名夭坪,根據(jù)擴展名識別文件的類型文判。
當經(jīng)過認證的用戶訪問惡意URL時(http://www.sampleapp.com/app/welcome.php/test.css),用戶的頁面就會被緩存到緩存目錄中室梅。
緩解措施
1戏仓、配置緩存策略,只有文件的HTTP緩存頭部允許緩存時竞惋,才會緩存文件
2柜去、將所有的靜態(tài)文件保存到某個指定目錄,并且只緩存這個目錄拆宛。
3嗓奢、配置web服務器,使其在處理諸如“http://www.example.com/home.php/nonexistent.css”的頁面時浑厚,不會返回home.php的內(nèi)容股耽,而會返回404或者302響應。