首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Web 文件上傳漏洞系列(零):上傳原理與三大漏洞類型總覽

     編輯:PHP 相關知識

文件上傳漏洞如幽靈般伴隨動態 Web 發展至今,頻發於商城、論壇、網盤、CMS。根因在於**上傳過程中多個關鍵屬性 (文件名、類型、路徑) 均源自客戶端可控輸入**,開發者錯誤信任並直接使用。本文梳理上傳流程、客戶端可控點、三大經典漏洞類型,為後續深入分析奠基。

HTTP 文件上傳流程解剖

POST /upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXYZ
...
------WebKitFormBoundaryXYZ
Content-Disposition: form-data; name="file"; filename="shell.php.jpg"
Content-Type: image/jpeg


------WebKitFormBoundaryXYZ--

服務端 `$_FILES['file']` 結構:

鍵名來源可信度說明
name客戶端 `filename=""`❌ 完全可控原始文件名,含路徑、擴展名、特殊字符
type客戶端 `Content-Type:`❌ 完全可控瀏覽器按擴展名猜測,可任意偽造
tmp_name服務端臨時文件✅ 可信PHP 生成的隨機臨時文件路徑
size服務端計算✅ 可信臨時文件大小 (字節)
error服務端判定✅ 可信上傳錯誤碼 (UPLOAD_ERR_OK=0 等)

核心誤區:以為 `type` 是服務端檢測的

許多開發者認為 `$_FILES['file']['type']` 是 PHP 自動分析文件內容得出的 MIME 類型。**錯誤!** 它直接來自客戶端請求頭 `Content-Type`,攻擊者用 Burp Suite 修改為 `image/jpeg` 即可繞過 `if ($type === 'image/jpeg')` 判斷。

三大經典漏洞類型預告

  1. 文件名檢測繞過 → 任意文件寫入 (Getshell)
    使用用戶原始文件名保存,配合雙重擴展名、Null Byte、路徑遍歷,寫入可執行腳本。
    👉 詳見系列(一)42742
  2. 移動目錄拼接繞過 → 越界寫入
    保存路徑拼接用戶可控參數 (如 `save_path`、`dirname`),利用 `../` 跳出預期目錄。
    👉 詳見系列(二)
  3. 信任 `type` / 僅檢查擴展名 → 偽裝文件執行
    僅驗證 `$_FILES['type']` 或擴展名,無內容檢測,上傳含木馬的圖片/文檔,配合解析漏洞執行。
    👉 詳見系列(三)

安全上傳「鐵三角」原則

  1. 存儲隔離:上傳目錄獨立於 Web 根目錄,或配置 Web 服務器**禁用腳本解析** (Nginx `location /uploads { deny all; }` / Apache `SetHandler default-handler`)。
  2. 輸入不信任:不直接使用 `name`、`type`、`client_filename`。文件名**服務端隨機生成** (UUID + 正確後綴),類型**服務端檢測** (finfo + 魔數)。
  3. 內容驗證:圖片二次渲染 (GD/Imagick 重寫),文檔轉換 (LibreOffice/Pandoc),殺毒掃描 (ClamAV)。

下一步閱讀

  • 系列(一)42742:文件名檢測繞過深度剖析與修復
  • 系列(二)42743:目錄遍歷與 Null Byte 繞過 include/讀取任意文件
  • 系列(三)42745:安全文件上傳完整實現代碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved