Directory traversal 目錄遍歷漏洞
Directory traversal 目錄遍歷漏洞
26/100
儲存草稿
釋出文章
ZripenYe
未選擇檔案
new
什麼是目錄遍歷?
目錄遍歷(也稱為檔案路徑遍歷)是一種 Web 安全漏洞,允許攻擊者讀取執行應用程式的伺服器上的任意檔案
。這可能包括應用程式程式碼和資料、後端系統的憑據以及敏感的作業系統檔案。在某些情況下,攻擊者可能能夠寫入伺服器上的任意檔案,從而允許他們修改應用程式資料或行為,並最終完全控制伺服器。
通過目錄遍歷讀取任意檔案
假設一個顯示待售商品影象的購物應用程式。影象通過一些 HTML 載入,如下所示:
<img src="/loadImage?filename=218.png">
該loadImage網址將filename引數返回指定的檔案的內容。影象檔案本身儲存在該位置的磁碟上/var/www/images/。要返回影象,應用程式將請求的檔名附加到此基本目錄並使用檔案系統 API 讀取檔案的內容。在上述情況下,應用程式從以下檔案路徑讀取:
/var/www/images/218.png
該應用程式沒有針對目錄遍歷攻擊實施任何防禦,因此攻擊者可以請求以下 URL 從伺服器的檔案系統中檢索任意檔案:
https://insecure-website.com/loadImage?filename=../../../etc/passwd
這會導致應用程式從以下檔案路徑讀取:
/var/www/images/../../../etc/passwd
該序列../
在檔案路徑內有效,意味著在目錄結構中上一級。三個連續的../序列從/var/www/images/檔案系統根目錄開始,因此實際讀取的檔案是:
/etc/passwd
在基於 Unix 的作業系統上,這是一個標準檔案,其中包含在伺服器上註冊的使用者的詳細資訊。
在 Windows 上,../和..\都是有效的目錄遍歷序列,檢索標準作業系統檔案的等效攻擊是:
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
利用檔案路徑遍歷漏洞的常見障礙
許多將使用者輸入放入檔案路徑的應用程式實現了對路徑遍歷攻擊的某種防禦,而這些通常可以被規避。
如果應用程式從使用者提供的檔名中剝離或阻止目錄遍歷序列,則可以使用各種技術繞過防禦。
-
可以使用檔案系統根目錄中的絕對路徑(例如filename=/etc/passwd)來直接引用檔案,而無需使用任何遍歷序列。
-
可能能夠使用巢狀遍歷序列,例如....//或..../,當內部序列被剝離時,它將恢復為簡單的遍歷序列。
-
可以使用各種非標準編碼(例如..%c0%af或..%252f)來繞過輸入過濾器。
-
如果應用程式要求使用者提供的檔名必須以預期的基本資料夾開頭,例如/var/www/images,則可能包含所需的基本資料夾,後跟合適的遍歷序列。例如:
filename=/var/www/images/../../../etc/passwd
- 如果應用程式要求使用者提供的檔名必須以預期的副檔名結尾,例如.png,則可以使用空位元組有效地終止所需副檔名之前的檔案路徑。例如:
filename=../../../etc/passwd%00.png
如何防止目錄遍歷攻擊
防止檔案路徑遍歷漏洞的最有效方法是完全避免將使用者提供的輸入傳遞給檔案系統 API。可以重寫執行此操作的許多應用程式函式,以更安全的方式提供相同的行為。
如果認為將使用者提供的輸入傳遞給檔案系統 API 是不可避免的,那麼應該同時使用兩層防禦來防止攻擊:
應用程式應在處理之前驗證使用者輸入。理想情況下,驗證應與允許值的白名單進行比較。如果這對於所需的功能是不可能的,則驗證應驗證輸入是否僅包含允許的內容,例如純字母數字字元。
驗證提供的輸入後,應用程式應將輸入附加到基本目錄並使用平臺檔案系統 API 規範化路徑。它應該驗證規範化路徑是否以預期的基本目錄開頭。
下面是一些簡單的 Java 程式碼示例,用於根據使用者輸入驗證檔案的規範路徑:
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// process file
}
靶場覆盤連結:
- 檔案路徑遍歷的簡單案例
- 使用絕對路徑繞過過濾器
- 使用雙重字元繞過過濾器
- 使用URL編碼繞過過濾器
- 檔案起始路徑條件
- 空位元組副檔名欺騙檔案過濾器
什麼是目錄遍歷?
目錄遍歷(也稱為檔案路徑遍歷)是一種 Web 安全漏洞,允許攻擊者讀取執行應用程式的伺服器上的任意檔案。這可能包括應用程式程式碼和資料、後端系統的憑據以及敏感的作業系統檔案。在某些情況下,攻擊者可能能夠寫入伺服器上的任意檔案,從而允許他們修改應用程式資料或行為,並最終完全控制伺服器。
在這裡插入圖片描述
通過目錄遍歷讀取任意檔案
假設一個顯示待售商品影象的購物應用程式。影象通過一些 HTML 載入,如下所示:
/var/www/images/218.png
該應用程式沒有針對目錄遍歷攻擊實施任何防禦,因此攻擊者可以請求以下 URL 從伺服器的檔案系統中檢索任意檔案:
https://insecure-website.com/loadImage?filename=../../../etc/passwd
這會導致應用程式從以下檔案路徑讀取:
/var/www/images/../../../etc/passwd
該序列../在檔案路徑內有效,意味著在目錄結構中上一級。三個連續的…/序列從/var/www/images/檔案系統根目錄開始,因此實際讀取的檔案是:
/etc/passwd
在基於 Unix 的作業系統上,這是一個標準檔案,其中包含在伺服器上註冊的使用者的詳細資訊。
在 Windows 上,…/和…\都是有效的目錄遍歷序列,檢索標準作業系統檔案的等效攻擊是:
https://insecure-website.com/loadImage?filename=......\windows\win.ini
利用檔案路徑遍歷漏洞的常見障礙
許多將使用者輸入放入檔案路徑的應用程式實現了對路徑遍歷攻擊的某種防禦,而這些通常可以被規避。
如果應用程式從使用者提供的檔名中剝離或阻止目錄遍歷序列,則可以使用各種技術繞過防禦。
可以使用檔案系統根目錄中的絕對路徑(例如filename=/etc/passwd)來直接引用檔案,而無需使用任何遍歷序列。
可能能夠使用巢狀遍歷序列,例如…//或…/,當內部序列被剝離時,它將恢復為簡單的遍歷序列。
可以使用各種非標準編碼(例如…%c0%af或…%252f)來繞過輸入過濾器。
如果應用程式要求使用者提供的檔名必須以預期的基本資料夾開頭,例如/var/www/images,則可能包含所需的基本資料夾,後跟合適的遍歷序列。例如:
filename=/var/www/images/../../../etc/passwd
如果應用程式要求使用者提供的檔名必須以預期的副檔名結尾,例如.png,則可以使用空位元組有效地終止所需副檔名之前的檔案路徑。例如:
filename=../../../etc/passwd%00.png
如何防止目錄遍歷攻擊
防止檔案路徑遍歷漏洞的最有效方法是完全避免將使用者提供的輸入傳遞給檔案系統 API。可以重寫執行此操作的許多應用程式函式,以更安全的方式提供相同的行為。
如果認為將使用者提供的輸入傳遞給檔案系統 API 是不可避免的,那麼應該同時使用兩層防禦來防止攻擊:
應用程式應在處理之前驗證使用者輸入。理想情況下,驗證應與允許值的白名單進行比較。如果這對於所需的功能是不可能的,則驗證應驗證輸入是否僅包含允許的內容,例如純字母數字字元。
驗證提供的輸入後,應用程式應將輸入附加到基本目錄並使用平臺檔案系統 API 規範化路徑。它應該驗證規範化路徑是否以預期的基本目錄開頭。
下面是一些簡單的 Java 程式碼示例,用於根據使用者輸入驗證檔案的規範路徑:
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// process file
}
靶場覆盤連結:
檔案路徑遍歷的簡單案例
使用絕對路徑繞過過濾器
使用雙重字元繞過過濾器
使用URL編碼繞過過濾器
檔案起始路徑條件
空位元組副檔名欺騙檔案過濾器
文章目錄
Markdown 2489 字數 87 行數 當前行 1, 當前列 0HTML 1773 字數 43 段落
本文來自部落格園,作者:{Zeker62},轉載請註明原文連結:https://www.cnblogs.com/Zeker62/p/15168129.html