名詞解釋

路徑遍歷是什麼 — 用 ../ 讀取伺服器上「本不該交出的檔案」的漏洞

路徑遍歷(目錄遍歷)是一種在檔名輸入中混入 ../ 等字元,從而讀寫到本不該公開的位置(.env、設定、金鑰、/etc)的漏洞。本文用圖解講解其原理,並從防禦視角解說主要的防禦手段(不把輸入直接用作路徑、將其限制在基準目錄內)。

發布於 2026-06-10 更新於 2026-10-06 閱讀時間 3 分鐘
本頁內容

路徑遍歷是指在檔名欄位中混入 ../,就能讀到伺服器深處 .env 的漏洞。本文講解其原理與可靠的防範方法(不會寫出攻擊步驟)。

會出現在哪裡

凡是「用使用者輸入來選擇檔案」的地方都是候選。

功能危險的用法
下載/預覽把 ?file= 中的檔名原樣使用
圖片/附件的顯示用 URL 參數拼出路徑的一部分
上傳在保存目標路徑中使用使用者指定的名字(寫入型·最危險)
範本/語言檔案讀取用 ?lang= 等動態選擇檔案

為什麼會成立(原理)

../ 表示「向上一級目錄」。當應用程式把 公開資料夾 + 使用者輸入 原樣串接起來開啟檔案時,用疊加了 ../ 的輸入就能存取到公開資料夾之外的檔案。

設想:/var/www/files/ + 使用者輸入
在輸入中疊加「向上一級」(../ ../ ../ …)
↓ 應用未正規化就串接並 open()
到達基準資料夾之外(.env·設定·金鑰·/etc)=讀取/寫入
把使用者輸入原樣串接到基準資料夾上,疊加 ../ 就會到達外部的檔案。

讀取會導致資訊外洩,寫入(上傳)則會被在任意位置放置檔案,有時還會發展為 RCE。

防禦:不把輸入用作路徑 + 限制在基準內

1

不把使用者輸入用作生檔案路徑(最重要)

要公開的檔案用 ID→實際檔案的對應表(白名單)來查。使用者傳入的只是「第 3 號」「invoice」等識別碼,實際路徑由伺服器決定。

2

正規化之後,務必確認「是否在基準目錄的內側」

用語言標準的路徑正規化(相當於 resolve/realpath)轉換為絕對路徑,並校驗它是否以所允許的基準目錄開頭。在外面就拒絕。../ 的簡單字串刪除存在編碼繞過,因此不可取。

3

以最小權限執行應用

把應用執行使用者能讀取的檔案收窄到業務所需的範圍。即便萬一被逃出,只要本來就讀不到,就不會產生危害。

4

把「不該交出的東西」放到公開根目錄之外

.env·.git·金鑰·備份,本來就不要放在 Web 根目錄或上傳資料夾裡。光靠放置位置,就能消除可被攻擊的對象。

本站的視角:它與放置位置的失誤屬於同一類問題,請按正確順序修正

路徑遍歷與 .env 公開的事故屬於同一類問題。兩者都是「本不該經由 Web 送達的東西,卻經由 Web 送達了」。暫時措施(回應標頭或簡單過濾)只能遮住表面,只要程式碼和放置位置沒修好,就會從別的路徑外洩。順序是①不把輸入用作路徑的程式碼 ②基準目錄內的檢查 ③根本上把祕密挪到公開根目錄之外。再配合閱讀 在共享租用伺服器上的安全設定,就能了解根本對策的做法。

與相似問題的區別

結果看起來可能相同——「本該不公開的檔案能從外部讀到」——但原因決定了該在哪裡修正。

問題原因修正的地方
路徑遍歷指向檔案的輸入能逃出允許的位置應用程式碼(不把輸入用作路徑)
本機檔案引入(LFI)輸入選擇了程式要載入並執行的檔案應用程式碼(固定可載入的檔案)
檔案留在公開目錄.env 或 .git 放在 Web 看得到的地方(→ 留在公開目錄的祕密)檔案的放置位置與 Web 伺服器設定
IDOR檔案 ID 格式正確,卻能指向別人的檔案應用的權限檢查

實際案例:Web 伺服器本身的缺陷

路徑遍歷不只出現在自製的應用中,也出現在被廣泛使用的產品裡。

  • Apache HTTP Server 2.4.49(2021):存在路徑遍歷缺陷(CVE-2021-41773),Apache 專案表示已知它在外部遭到利用。2.4.50 修正了它,但修正不完整(CVE-2021-42013),於是在 2.4.51 再次修正。依設定不同,它不只導致檔案讀取,還會導致 RCE。
  • WordPress 核心(2026):解析頁面範本的程式碼中的路徑遍歷,導致了在特定條件下可達 RCE 的檔案引入缺陷(CVE-2026-87902)(→ CVE-2026-87902 解說,英文)。

2024 年 5 月,美國 CISA 與 FBI 發出警示,要求製造商消除這類缺陷。據其說明,當時 CISA 的 KEV(確認已被利用的漏洞清單)中有 55 個目錄遍歷漏洞。在 MITRE 於 2025 年 12 月公布的「CWE Top 25」中,路徑遍歷(CWE-22)排名第六。

如何檢查自己的網站

1

找出接收輸入的檔案操作

在程式碼中搜尋開啟或傳送檔案的函式(open、readFile、sendFile、include 等),或組裝路徑的函式(path.join 等),看請求的值是否可能傳到那裡。

2

確認檢查的順序

在使用輸入的地方,確認是先正規化路徑(path.resolve 或 realpath),之後才檢查它是否在基準目錄內。如果程式碼只在正規化之前檢查字串,就修正順序。

3

確認 Web 伺服器與產品的版本

確認你沒有在執行有已知路徑遍歷的版本,例如 Apache 2.4.49 或 2.4.50。CVE / KEV 查詢可以顯示所用產品的已知漏洞。

4

確認不該被看到的檔案

用網站健檢確認 .env、.git 與資料庫傾印檔無法從外部讀取。若可以讀取,請把放置位置當作與路徑遍歷不同的另一項工作來修正。

出處(一手資料)

  • CISA 與 FBI, "Secure by Design Alert: Eliminating Directory Traversal Vulnerabilities in Software"(2024 年 5 月 2 日)— cisa.gov(KEV 中有 55 筆、使用隨機識別碼)
  • Apache HTTP Server, "Apache HTTP Server 2.4 vulnerabilities" — httpd.apache.org(CVE-2021-41773、CVE-2021-42013)
  • MITRE, "2025 CWE Top 25 Most Dangerous Software Weaknesses"(2025 年 12 月)— cwe.mitre.org(CWE-22 排名第六)
  • OWASP, "Path Traversal" — owasp.org
  • IPA「安全なウェブサイトの作り方」(日文)— ipa.go.jp(未檢查的路徑參數/目錄遍歷)

接下來閱讀

分類編號

CWE 對造成漏洞的弱點類型進行分類,MITRE ATT&CK 對攻擊者的技術進行分類。兩者皆由 MITRE 維護,廣泛用於標註漏洞資訊與偵測規則。

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

Q路徑遍歷會外洩什麼?
A

本來這個應用程式不應讓人接觸到的檔案。典型例子有 .env(資料庫憑證、API 金鑰)、設定檔、私鑰、原始碼、作業系統的 /etc 目錄下的檔案等。不僅是讀取,一旦被濫用於指定上傳目標路徑,還會被寫入到任意位置,進而可能發展為 RCE(任意程式碼執行)。

Q最主要的防禦是什麼?
A

就是「不把使用者的輸入原樣用作檔案路徑」。如果實在要用,就把它轉換為白名單(ID 或固定的檔名集合),並用函式庫對路徑進行正規化後,務必確認「它是否落在基準目錄的內側」。僅靠副檔名校驗或簡單地刪除 ../ 是會被繞過的。

Q用 .htaccess 或回應標頭堵上就行了嗎?
A

那只是針對「本不該交出的檔案被放在了公開目錄」這一另一個問題的暫時措施。根本在於糾正設定「把應用本體、.env、.git 放到公開根目錄之外」,以及撰寫不把輸入用作路徑的程式碼。暫時措施和根本對策是兩項不同的工作。

Q目錄遍歷和路徑遍歷是同一件事嗎?
A

是的。日本 IPA 的指南稱之為目錄遍歷(directory traversal),MITRE 的分類(CWE-22)則稱為 Path Traversal。兩者都是指「指向檔案的輸入觸及了允許範圍之外的檔案」。

Q給檔案隨機 ID 能防止它嗎?
A

這是有效的做法。美國 CISA 與 FBI 在 2024 年 5 月的警示中,建議為每個檔案產生隨機識別碼,並把原始檔名等相關資訊另外保存。這樣使用者輸入就永遠不會成為路徑的一部分,這類缺陷也就無從發生。

Q它與本機檔案引入(LFI)有什麼不同?
A

路徑遍歷是指允許範圍之外的檔案可以被讀取或寫入。LFI 是指由輸入選擇程式要載入並執行的檔案,而路徑遍歷常被用來把它指向外部的檔案。因為 LFI 不只是讀取,而是把檔案當成程式碼執行,所以更容易導致 RCE。