Atom
CWE-22:Path Traversal

CWE-22:Path Traversal

CWE-22:Path Traversal(路徑跳脫漏洞)

Web 應用程式中若允許使用者輸入檔案路徑而未加限制,就可能導致 Path Traversal(路徑跳脫)攻擊。攻擊者可利用 ../ 等字串跳離預期目錄,存取系統上任何可讀取的檔案

例如:

1
../../../../etc/passwd

一、漏洞發生位置與程式碼示例

程式碼如下:

1
2
3
4
5
6
public ServiceRespModal uploadSolutionExcelFile(MultipartFile file, String filePath) {
try (DirectoryStream<Path> stream =
Files.newDirectoryStream(Paths.get(filePath))) {
...
}
}

這段程式碼問題在於直接使用外部傳入的 filePath

完全沒有:

  • 白名單(allowlist)限制
  • 禁止 ../ 等跳脫字串
  • 限制只能存取固定資料夾
  • 任何編碼或過濾

二、可能造成的風險

任意檔案讀取

攻擊者可讀取:

  • 伺服器設定檔
  • 環境參數
  • API 金鑰
  • Log 檔案
  • 系統帳戶設定(例如 /etc/passwd)

目錄瀏覽

攻擊者可列出目錄內容,以了解伺服器架構。

調用開檔流程,引發進一步攻擊

若該程式會解析 Excel,攻擊者可上傳惡意檔案,誘使應用程式執行危險流程。

三、修補建議

使用Allowlist限制可讀取的資料夾

只允許後端存取特定目錄:

1
2
3
4
5
6
Path base = Paths.get("/opt/upload_dir").toAbsolutePath().normalize();
Path target = base.resolve(filePath).normalize();

if (!target.startsWith(base)) {
throw new SecurityException("Invalid file path.");
}

禁止危險字串

阻擋(或正規化後比對):

  • ..
  • / 或 \ 開頭
  • URL decode 後的 %2e%2e%2f

移除使用者指定的完整路徑

  • 使用者只能提供檔名,後端自行決定路徑。
    1
    2
    String safeFileName = StringUtils.cleanPath(uploadFile.getOriginalFilename());
    Path uploadPath = Paths.get("/opt/file_upload/" + safeFileName);

使用既有框架的安全路徑工具

例如 Spring:

1
2
3
StringUtils.cleanPath()

Path.normalize()

可自動處理跳脫字串。

本文作者:Atom
本文鏈接:https://d0ngd.github.io/2025/12/03/CWE-22:Path Traversal/
版權聲明:本文採用 CC BY-NC-SA 3.0 CN 協議進行許可