文件上傳漏洞與phpcms漏洞安全分析

目錄

1. 文件上傳漏洞簡介

2. 文件上傳漏洞的危害

3. 文件上傳漏洞的觸發條件

1. 文件必須能被服務器解析執行

2. 上傳目錄必須支持代碼執行

3. 需要能訪問上傳的文件

4. 例外情況:非腳本文件也可能被執行

4. 常見的攻擊手法

4.1 直接上傳惡意文件

4.2 文件擴展名繞過

4.3 解析漏洞利用

5. 文件上傳漏洞的防御措施

5.1 文件類型檢查

5.2 上傳路徑與訪問控制

5.3 服務器配置安全

6.phpcms文件上傳漏洞安全分析

6.1.前言

6.2.漏洞情況

第一關:初代 PHPCMS 頭像上傳漏洞

第二關:FineCMS 的補丁與再次繞過(競爭條件漏洞)

?編輯

第三關:利用隨機數生成目錄名漏洞

第四關:新補丁

正確的修復方式

結論


1. 文件上傳漏洞簡介

文件上傳漏洞是一種常見的 Web 安全漏洞,攻擊者可以通過該漏洞上傳惡意文件,如 WebShell、木馬或其他惡意代碼腳本,以實現遠程控制服務器、竊取數據或發起進一步攻擊。這類漏洞通常源于 Web 應用在文件上傳功能的安全校驗不當,例如缺乏文件類型驗證、文件存儲位置不合理或服務器解析機制存在漏洞。

2. 文件上傳漏洞的危害

文件上傳漏洞可能導致以下安全風險:
1. 代碼執行:攻擊者上傳 Web 腳本語言文件(如 .php、.jsp、.asp),服務器解析執行后,黑客可直接控制服務器。
2. 惡意文件傳播:上傳病毒或木馬文件,誘騙用戶或管理員下載執行,導致感染。
3. 策略文件篡改:上傳 crossdomain.xml 等策略文件,控制 Flash 或其他前端組件的跨域行為,可能導致 CSRF、XSS 等安全問題。
4. 釣魚與欺詐:上傳偽造的釣魚圖片,或利用圖片解析漏洞,在部分瀏覽器環境下執行惡意 JavaScript 代碼。
5. 服務器程序溢出:利用某些應用的文件解析邏輯漏洞,如圖片處理模塊缺陷,實現遠程代碼執行(RCE)。
6. 本地文件包含(LFI)利用:上傳包含惡意 PHP 代碼的文本文件,再通過 LFI 漏洞執行該腳本,從而實現服務器控制。

3. 文件上傳漏洞的觸發條件

要成功利用文件上傳漏洞,攻擊者上傳的后門文件需要滿足以下關鍵條件:

1. 文件必須能被服務器解析執行

攻擊者上傳的惡意文件必須符合服務器的運行環境。例如:

  • 如果服務器運行的是 PHP 環境,則攻擊者需要上傳 .php 文件
  • 如果服務器運行的是 JSP 環境,則需要上傳 .jsp 文件
  • 如果服務器運行的是 ASP.NET,則 .aspx 文件可能有效。

示例:
如果目標服務器只支持 PHP,而攻擊者上傳的是 Java Webshell(.jsp),即使上傳成功,服務器也無法解析執行,攻擊仍然無效。

2. 上傳目錄必須支持代碼執行

即使上傳了可執行腳本,文件存儲的路徑也必須是可執行目錄,否則服務器不會解析代碼。

  • 可執行目錄: 服務器會解析 .phpjspasp 等腳本,并執行其中的代碼。
  • 非可執行目錄: 服務器會將腳本文件當作普通文本處理,無法運行惡意代碼。

示例:
如果 Web 應用將上傳的文件存放在 /uploads/ 目錄,并且 Nginx 或 Apache 已經配置禁止該目錄執行腳本,那么即使攻擊者上傳了 shell.php,服務器也不會解析并執行其中的代碼,攻擊失敗。

3. 需要能訪問上傳的文件

通常,上傳文件成功后,服務器會返回上傳文件的訪問地址。如果攻擊者無法訪問這個地址,文件上傳漏洞也無法被利用。

示例:

  • 如果服務器存儲路徑是 /var/www/uploads/,但外部無法訪問該目錄,即使攻擊者上傳了 Webshell 也無法觸發它。
  • 如果文件上傳成功,但服務器未返回文件訪問路徑,攻擊者無法得知上傳文件存放在哪里,除非能通過其他漏洞(如目錄遍歷)找到它。

4. 例外情況:非腳本文件也可能被執行

某些情況下,即使上傳的不是腳本文件,也可能被服務器錯誤解析,從而執行惡意代碼。例如:

  • 圖片馬(圖片木馬):攻擊者上傳一張 .jpg.png 圖片,但圖片的元數據中隱藏了 PHP 代碼。如果服務器存在解析漏洞,可能會執行隱藏代碼。
  • 配置錯誤的 Web 服務器:某些中間件(如 Apache、Nginx、IIS)可能存在解析漏洞,使非 .php 文件也會被當作 PHP 代碼解析。

4. 常見的攻擊手法

4.1 直接上傳惡意文件

攻擊者利用未做任何安全限制的上傳接口,直接上傳如 .php.jsp.asp 等可執行腳本。

4.2 文件擴展名繞過

攻擊者使用以下方式繞過服務器對文件后綴的限制:

  • 雙重擴展名(如 shell.php.jpg
  • 大小寫繞過(如 SHELL.PHP
  • 空格或特殊字符繞過(如 shell.php.
  • MIME 類型偽造(通過修改 Content-Type 偽造合法文件)

4.3 解析漏洞利用

不同 Web 服務器對文件解析方式不同,可能導致繞過擴展名檢查。例如:

  • Apache 服務器:支持 .htaccess 配置文件,攻擊者可以上傳 .htaccess 文件修改解析規則。
  • IIS 服務器:shell.asp;.jpg 可能仍會被解析為 .asp
  • Nginx 解析漏洞:某些版本可能會錯誤解析 .php/ 文件。

5. 文件上傳漏洞的防御措施

5.1 文件類型檢查

  • 采用白名單機制,僅允許上傳安全的文件類型,如 .jpg.png.pdf 等。

  • 驗證文件擴展名,避免使用雙重擴展名(如 shell.php.jpg)繞過檢測。

  • 檢查 MIME 類型,防止攻擊者偽造文件類型。

  • 使用文件內容分析工具(如 fileinfo)檢查文件實際類型。

5.2 上傳路徑與訪問控制

  • 存儲文件時重命名,避免使用用戶自定義的文件名。

  • 限制上傳目錄的權限,確保其不可執行(例如通過 Nginx 配置 disable_php )。

  • 采用分離存儲策略,將上傳文件存放在與 Web 目錄隔離的存儲服務器上。

  • 避免返回完整的文件路徑,降低攻擊者利用漏洞的可能性。

5.3 服務器配置安全

  • 禁止執行上傳目錄中的腳本,如 Apache 配置 .htaccess 限制 PHP 解析。

  • 禁用危險函數,如 eval()exec(),防止遠程代碼執行。

  • 開啟 WAF(Web 應用防火墻),檢測并攔截惡意上傳行為。

  • 定期掃描上傳文件,發現并刪除可疑文件。

6.phpcms文件上傳漏洞安全分析

6.1.前言

PHPCMS 曾經是國內流行的 CMS 之一,但因安全漏洞頻發,給廣大站點帶來了嚴重的安全隱患。其中,頭像上傳漏洞尤為經典,不僅影響 PHPCMS 本身,還波及了大量借鑒其代碼的 CMS,如 FineCMS。

6.2.漏洞情況

第一關:初代 PHPCMS 頭像上傳漏洞

PHPCMS 頭像上傳功能的邏輯如下:

  1. 用戶上傳 ZIP 壓縮包。

  2. 服務器解壓 ZIP,并刪除非 JPG 文件。

漏洞代碼片段:

漏洞點分析

  • 解壓后僅刪除 ZIP 根目錄中的非法文件,但未遞歸刪除文件夾中的非法文件

復現步驟如下:

  1. 攻擊者可上傳 ZIP 包,其中包含 test?目錄,并在其中放置 web.php,繞過刪除機制。

第二關:FineCMS 的補丁與再次繞過(競爭條件漏洞)

FineCMS 修復代碼:

利用時間差上傳 ZIP 文件,其中包含如下代碼:

<?php fputs(fopen('../../../../../shell.php','w'),'<?php phpinfo();eval($_POST[a]);?>');?>

在服務器解壓 ZIP 并執行刪除操作的瞬間,攻擊者訪問 webshell,實現 Getshell。

復現步驟如下:利用burp抓包,然后通過不停發包與刷新,訪問php文件,讓他在上級或者其他級目錄生成惡意代碼

第三關:利用隨機數生成目錄名漏洞

為了防止競爭條件攻擊,開發者修改了代碼,使上傳的文件存放在隨機命名的目錄中。然而,新機制未能正確處理解壓失敗的情況,導致 Webshell 仍然可能被上傳。

復現步驟如下:

  1. 構造一個解壓失敗的壓縮包。
  2. 讓 PHPCMS 處理解壓失敗,但部分文件仍然被釋放到 Web 目錄。
  3. 由于目錄刪除機制缺陷,Webshell 仍然得以保留。

如何構造解壓失敗的壓縮包

第四關:新補丁

  • 頭像文件解壓至隨機命名的目錄。

  • 發生錯誤時,立即刪除臨時目錄。

代碼示例:

繞過方法:路徑穿越攻擊(Directory Traversal)

  • 構造 ZIP 文件,修改其內部文件名,如 ../../../index.php

  • 利用 Notepad++ 修改 ZIP 內部文件路徑,上傳后覆蓋網站根目錄的 index.php,實現 Webshell。

正確的修復方式

以上漏洞的根本問題在于:

  1. 不應直接在 Web 目錄下解壓用戶上傳的文件

  2. 應使用白名單方式限制解壓文件

  3. 避免使用 Zip 方式上傳頭像,改用前端處理

安全修復方案:

  • 將 ZIP 文件解壓到臨時目錄(如 /tmp)

  • 僅提取合法的 JPG 文件,其他文件一律忽略

  • 對解壓縮的文件進行嚴格 MIME 類型檢測

  • 采用白名單方式,避免黑名單的局限性

結論

PHPCMS 頭像上傳漏洞的演變歷程,展現了補丁打補丁的錯誤思路。正確的修復方法應從設計上避免問題,而不是簡單地對抗攻擊者的新手法。開發者應深刻理解文件上傳的安全風險,避免重蹈覆轍。

僅僅是技術分享,不要再審核卡我啦

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897026.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模塊和端口

1、模塊 模塊內部的5個組成是&#xff1a;變量聲明 數據流語句 低層模塊實例 函數和任務 行為語句 SR鎖存器 timescale 1ns / 1psmodule SR_latch(input wire Sbar ,input wire Rbar ,output wire Q ,output wire Qbar);nand…

爬蟲(持續更新ing)

爬蟲&#xff08;持續更新ing&#xff09; # 網絡請求 # url統一資源定位符&#xff08;如&#xff1a;https://www.baidu.com&#xff09; # 請求過程&#xff1a;客戶端的web瀏覽器向服務器發起請求 # 請求又分為四部分&#xff1a;請求網址&#xff0c;請求方法&#xff08…

2025.3.2機器學習筆記:PINN文獻閱讀

2025.3.2周報 一、文獻閱讀題目信息摘要Abstract創新點網絡架構實驗結論不足以及展望 一、文獻閱讀 題目信息 題目&#xff1a; Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊&#xff1a; Water Resource…

使用IDEA如何隱藏文件或文件夾

選擇file -> settings 選擇Editor -> File Types ->Ignored Files and Folders (忽略文件和目錄) 點擊號就可以指定想要隱藏的文件或文件夾

前端基礎之腳手架

腳手架結構 目錄結構 這里的package.json&#xff0c;存放著我們去執行npm run serve 或是npm run build的腳本文件 package-lock.json中存放著我們使用的外部包的版本類型&#xff0c;相當于maven src下的main.js是整個項目的入口文件 src下的components用于存放組件&#xff…

MacBook上API調??具推薦

在當今的軟件開發中&#xff0c;API調用工具已經成為了開發者不可或缺的助手。無論是前端、后端還是全棧開發&#xff0c;API的調試、測試和管理都是日常工作中的重要環節。想象一下&#xff0c;如果沒有這些工具&#xff0c;開發者可能需要手動編寫復雜的CURL命令&#xff0c;…

pgsql行列轉換

目錄 一、造測試數據 二、行轉列 1.函數定義 2.語法 3.示例 三、列轉行 1.函數定義 2.語法 3.示例 一、造測試數據 create table test ( id int, json1 varchar, json2 varchar );insert into test values(1,111,{111}); insert into test values(2,111,222,{111,22…

NVIDIA(英偉達) GPU 芯片架構發展史

GPU 性能的關鍵參數 CUDA 核心數量&#xff08;個&#xff09;&#xff1a;決定了 GPU 并行處理能力&#xff0c;在 AI 等并行計算類業務下&#xff0c;CUDA 核心越多性能越好。 顯存容量&#xff08;GB&#xff09;&#xff1a;決定了 GPU 加載數據量的大小&#xff0c;在 AI…

《Python實戰進階》No 10:基于Flask案例的Web 安全性:防止 SQL 注入、XSS 和 CSRF 攻擊

第10集&#xff1a;Web 安全性&#xff1a;防止 SQL 注入、XSS 和 CSRF 攻擊 在現代 Web 開發中&#xff0c;安全性是至關重要的。無論是用戶數據的保護&#xff0c;還是系統穩定性的維護&#xff0c;開發者都需要對常見的 Web 安全威脅有深刻的理解&#xff0c;并采取有效的防…

【大數據分析 | 深度學習】在Hadoop上實現分布式深度學習

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?智能大數據分析 ? ? ? 智能大數據分析是指利用先進的技術和算法對大規模數據進行深入分析和挖掘&#xff0c;以提取有價值的信息和洞察。它結合了大數據技術、人工智能&#xff08;AI&#xff09;、機器學習&#xff08;ML&a…

盛鉑科技SCP4000射頻微波功率計與SPP5000系列脈沖峰值 USB功率計 區別

在射頻&#xff08;RF&#xff09;和微波測試領域&#xff0c;快速、精準的功率測量是確保通信系統、雷達、衛星設備等高性能運行的核心需求。無論是連續波&#xff08;CW&#xff09;信號的穩定性測試&#xff0c;還是脈沖信號的瞬態功率分析&#xff0c;工程師都需要輕量化、…

自學微信小程序的第十三天

DAY13 1、使用map組件在頁面中創建地圖后&#xff0c;若想在JS文件中對地圖進行控制&#xff0c;需要通過地圖API來完成。先通過wx.createMapContext()方法創建MapContext&#xff08;Map上下文&#xff09;實例&#xff0c;然后通過該實例的相關方法來操作map組件。 const m…

深入解析 C# 中的泛型:概念、用法與最佳實踐

C# 中的 泛型&#xff08;Generics&#xff09; 是一種強大的編程特性&#xff0c;允許開發者在不預先指定具體數據類型的情況下編寫代碼。通過泛型&#xff0c;C# 能夠讓我們編寫更靈活、可重用、類型安全且性能優良的代碼。泛型廣泛應用于類、方法、接口、委托、集合等多個方…

H5DS編輯器是如何讓企業快速構建動態頁面

H5DS編輯器核心亮點&#xff1a; 1.拖拽式操作&#xff0c;小白友好&#xff1a;無需設計與代碼基礎&#xff01;通過簡單拖拽元素、調整文字和動畫&#xff0c;即可生成交互式H5頁面。內置海量模板和素材庫&#xff0c;支持自定義設計風格&#xff0c;輕松適配企業品牌需求。…

Unity ECS與MonoBehaviour混合架構開發實踐指南

一、混合架構設計背景 1. 技術定位差異 ECS&#xff08;Entity Component System&#xff09;&#xff1a;面向數據設計&#xff08;DOD&#xff09;&#xff0c;適用于大規模實體計算&#xff08;如10萬單位戰斗&#xff09; MonoBehaviour&#xff1a;面向對象設計&#xf…

[項目]基于FreeRTOS的STM32四軸飛行器: 三.電源控制

基于FreeRTOS的STM32四軸飛行器: 三.電源控制 一.IP5305T芯片手冊二.電源控制任務 一.IP5305T芯片手冊 注意該芯片低功耗特性&#xff0c;為防止進入待機&#xff0c;每隔一段時間發送一個電平。 官方提供的芯片外圍電路設計圖&#xff1a; 電氣特性&#xff1a; 當負載電流持…

java環境部署

java環境部署 一、準備工作 jrejdkeclipse jdk下載&#xff1a;21和1.8-----官網&#xff1a;Oracle&#xff1a;Java 下載 |神諭 該處選擇要依據自身的系統類型選擇下載 idea的下載安裝&#xff1a;IntelliJ IDEA | Other Versions 二、安裝 三、環境配置 四、使用 五、i…

微服務通信:用gRPC + Protobuf 構建高效API

引言 在微服務架構中&#xff0c;服務之間的通信是系統設計的核心問題之一。傳統的RESTful API雖然簡單易用&#xff0c;但在性能、類型安全和代碼生成等方面存在一定的局限性。gRPC作為一種高性能、跨語言的RPC框架&#xff0c;結合Protobuf&#xff08;Protocol Buffers&…

使用 Docker 和 Nginx 高效部署 Web 服務(適用于慈云數據云服務器)

前言 在現代 Web 服務部署中&#xff0c;Docker 和 Nginx 的結合是一種高效、靈活且可擴展的解決方案。 Docker 使應用程序及其依賴項封裝到一個獨立的容器中&#xff0c;確保一致性&#xff0c;并簡化部署過程。Nginx 作為高性能 Web 服務器和反向代理&#xff0c;能夠高效處…

C 語言數據結構(一):時/空間復制度

目錄 一、前言 1. 什么是數據結構 2. 什么是算法 二、時 / 空間復雜度 1. 算法效率 2. 時間復雜度 2.1 時間復雜度的概念 2.2 大 O 的漸進表示法 2.3 常見的計算時間復雜度的例子 2.3.1 實例 1 2.3.2 實例 2 2.3.3 實例 3 2.3.4 實例 4 2.3.5 實例 5 &#xff1a…