技術解析 | Web緩存欺騙測試
*本文原創作者:m09046105,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
前言:
Omer Gil在BlackHat USA 2017 和BSides Tel-Aviv 2017 上,對Web 緩存欺騙技術這種攻擊技術進行了演示,在他發布的「Web 緩存欺騙技術白皮書」中也做了詳細的介紹。在特定情況下,web緩存欺騙攻擊可以導致攻擊者獲得受害者的敏感信息。
Web緩存是指Web資源以副本的形式介於Web伺服器和客戶端之間,當下一個相同請求來到的時候,會根據緩存機制決定是直接使用副本響應訪問請求,還是向源伺服器再次發送請求。在實際應用中,web緩存十分常見,主要是Web緩存有著如下的優點:產生極小的網路流量,減少對源伺服器的請求,降低伺服器的壓力, 同時能夠明顯加快頁面打開速度。緩存分為以下幾種類型:(1)資料庫緩存,當web應用的資料庫表繁多,為了提供查詢的性能,會將查詢後的數據放到內存中進行緩存,下次從內存緩存直接返回,比如memcached(2)瀏覽器緩存,瀏覽器會將一些頁面緩存到客戶端 ,不同的瀏覽器有著自己的緩存機制。(3) 服務端緩存:常見的服務端緩存比如:CND、Squid、Nginx反向代理等。
0x00漏洞原理
假設我們要訪問的某個網站使用了伺服器緩存技術,架構如下:
當註冊的用戶成功登入了該網站,會跳轉到自己的賬戶頁面my.php,該Nginx反向代理伺服器會將css、js、jpg等靜態資源緩存到nginx設定的目錄下。受害者不小心在瀏覽器中輸入了如下的url:http://victim.com/my.php/favicon.ico , favicon.ico 並不存在,此時會發什麼神奇的事情呢?
Nginx反向代理伺服器發現url以靜態文件的擴展名(.ico)結尾,由於favicon.ico 不存在,它的緩存機制會將 my.php 緩存到緩存目錄中,這時攻擊者訪問了:http://victim.com/my.php/favicon.ico ,之前 緩存的帳戶頁面便成功返回給了攻擊者。
0x01利用條件:
經過上一步的分析,我們知道該漏洞要想成功利用需要滿足三個條件:
1.訪問http://victim.com/my.php/favicon.ico 頁面時, Web伺服器返回了該my.php的內容
2. 伺服器的緩存機制通過url中的擴展名來判斷是否進行緩存文件,並且忽略任何緩存頭。
3.受害者必須訪問過了http://victim.com/my.php/favicon.ico 這種頁面,也就是說受害者已經將my.php的內容緩存到了緩存伺服器上。
要想滿足以上幾個條件,需要考慮到不同的web伺服器、代理機制以及瀏覽器著各自的特性。比如:我們在tomcat伺服器上訪問http://victim.com/my.jsp/1.css,伺服器無法返回my.jsp的內容,因此這種攻擊無法利用在tomcat+java上面。
0x02漏洞演示:
test.php<?phpecho "123";?>
通過以上的實驗,我們知道apache+ php,滿足第一個條件:訪問http://victim.com/my.php/favicon.ico 頁面時,Web伺服器返回了該my.php的內容。我們的緩存功能使用的是nginx反向代理中的緩存功能,nginx的緩存機制是根據url中的擴展名來判斷是否進行緩存文件,同時我們設置其忽略任何緩存頭,因此也滿足了第二個條件。
Web伺服器的登入頁面和賬戶頁面:
Login.php<html><head><title>login</title></head><body><form action="my.php" method="post"><input name="name" type="text" value="<?php echo $_COOKIE["name"]; ?>" /><input type="submit" name="submit" value="Login" /></form></body></html>My.php<?php $name = $_POST["name"];$cookie = $_COOKIE["name"];if($name=="admin"){echo "Welcome ".$_POST["name"] ;setcookie("name",$name,time()+600);}else{if($cookie=="admin"){echo "Welcome ".$_COOKIE["name"] ;}else{echo "<script>window.location.href = "./login.php";</script>";}}?>
當用戶成功登入之後,跳轉到自己的賬戶頁面my.php
此時我們通過社工的方法誘使管理員訪問了my.php/靜態資源 的url,便在nginx 緩存目錄中發現了緩存的管理員的my.php頁面。
當我換一個瀏覽器firefox訪問 /my.php/1.css地址的時候,成功返回來之前admin用戶緩存到nginx緩存目錄裡面的內容,即admin的賬戶信息!
0x03漏洞危害及利用
正如前文所說的漏洞利用條件,此外還需要結合社工的方法,誘使登入網站的用戶特別是有許可權的用戶(管理員)等,訪問http://victim.com/my.php/靜態資源 這種形式的鏈接。
攻擊者通過這種攻擊,可以獲取到受害者的賬戶等敏感信息。
0x04預防措施
預防該類攻擊,只要保證以上的攻擊條件中有任何一個不滿足即可實現,通過以下三個方面來預防:
(1)合理配置web伺服器
通過配置伺服器對於http://victim.com/my.php/favicon.ico 這類的請求頁面,不返回my.php頁面的內容,可以返回404或302.
(2)合理設置緩存機制
將緩存文件的緩存機制配置為僅當緩存文件的HTTP緩存標頭允許時才進行緩存。
(3)提高管理員等的安全意識
作為網站的用戶,禁止訪問http://victim.com/my.php/favicon.ico之類的連接請求。
*本文原創作者:m09046105,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


※FreeBuf街采 | 新年第一彈!FB小姐姐的信息安全小調查
※駐場工程師眼中的政務雲安全
TAG:FreeBuf |