跳至主要內容
>_ITDITD網站資安平台

資安指南

檔案上傳漏洞:從設計上防止 web shell 與 RCE

設計錯誤時,檔案上傳會變成嚴重的漏洞:未經驗證的攻擊者上傳一個檔案,再由伺服器執行(web shell → RCE),這正是 2026 年 Joomla 頁面建構器遭大規模利用的模式。要分層防禦:驗證、伺服器端檢查、存放在網站根目錄之外、禁止執行。

發布於 2026-07-08 更新於 2026-10-04 閱讀時間 3 分鐘

對象:應用程式(或安裝的擴充套件)會接收檔案的人,例如表單、管理後台、CMS 外掛、API。本文不包含攻擊方法,只依據公開事實說明如何讓自己的上傳功能變得安全。相關文章:在 CVE 修補手冊中徹底修正相依套件的缺陷,以及組織的資安基本對策。

免驗證 → RCE
最糟的組合;會成為無差別掃描的目標
CWE-434
不受限制地上傳危險類型的檔案
只檢查副檔名
會被偽造和雙重副檔名繞過
分層防禦
一層失效,下一層仍能擋下

實際會發生什麼(用白話說)

多數應用程式都有接收檔案的地方,例如「上傳圖片」「更換圖示」「附加文件」。如果這裡防護薄弱,攻擊者會送出偽裝成圖片的腳本檔,讓它被存進網頁可存取的資料夾。接著只要在瀏覽器中開啟那個檔案的 URL,如果伺服器把內容當成程式執行,攻擊者就能遠端執行指令。這就是 web shell(被留下的小型遠端控制程式),之後就會發生竄改網頁、竊取資料、偷偷建立管理員帳號,以及擴散到其他系統。

問題在於存放位置與執行,而不是接收檔案

上傳是正當的功能。危險在於把收到的東西,以可以執行的形式放在可以執行的地方。反過來說,即使收到可疑的檔案,只要它落在絕不執行的地方、內容經過檢查、端點需要驗證,就不會造成損害。請把思維從「擋下壞檔案」轉換為「絕不讓存放位置執行任何東西」。

2026 年的真實案例:Joomla 擴充套件遭大規模利用(相同模式)

2026 年,多個 Joomla 擴充套件接連公開了完全相同的「免驗證上傳 → RCE」模式,並被廣泛利用。據報導,它們都是「沒有驗證檢查+沒有檔案類型檢查+存放在網站根目錄下」這種典型組合。範圍從頁面建構器擴大到活動行事曆擴充套件,CISA 也設定了很短的修補期限。

三個真實案例(依據公開資訊)
SP Page Builder(CVE-2026-48908)
JoomShaper 開發。影響 6.6.1 以下版本,於 6.6.2 修正。據報導,自訂圖示的上傳沒有執行驗證或類型檢查;CVSS 10.0,已遭實際利用(列入 CISA KEV)。警示解說:CVE-2026-48908。
iCagenda(CVE-2026-48939)
joomlic 開發的活動行事曆擴充套件。影響 3.2.1–3.9.14/4.0.0–4.0.7,於 3.9.15/4.0.8 修正。據報導,公開活動報名表單的附件處理,其存取控制只在顯示層執行;CVSS 10.0,已遭實際利用(列入 CISA KEV)。警示解說:CVE-2026-48939。
Page Builder CK(CVE-2026-56290)
joomlack.fr 開發。影響 3.5.10 以下版本,於 3.6.0 修正(舊版系列回溯修正至 3.1.1/3.4.10)。據報導是相同的免驗證上傳導致 RCE;CVSS 10.0。
共同點
不需要登入就能利用=成為無差別掃描的目標。據報導,攻擊著重於維持存取:建立隱藏的管理員帳號並植入 web shell,讓攻擊者在漏洞修補後仍能保有存取。
第一步修正
把受影響的擴充套件更新到修補版本(並盤點、移除不使用的擴充套件)。再加上下文的設計與設定,分層防禦。

教訓:沒在用的擴充套件,往往是最常被利用的弱點

這些案例有一個共同點:攻擊者是透過被遺忘、卻仍安裝著的擴充套件進來的。每增加一個 CMS 外掛或擴充套件,攻擊面就多一分。光是盤點並刪除不使用的東西,就能減少這類大規模利用可以打中的目標(如何盤點你的資產)。

攻擊的每個階段,以及如何擋下

這種模式每一步都有可以擋下它的地方。請把它當成「可以在哪裡擋下」來閱讀,而不是攻擊方法。

1. 檔案被送到未經驗證的端點

任何人都能連到上傳處理程式並送出腳本。

對策:驗證+權限檢查+CSRF 權杖

↓

2. 通過類型檢查並被儲存

副檔名/Content-Type 被偽造,偽裝成「圖片」。

對策:伺服器端允許清單+內容(magic bytes)檢查

↓

3. 落在網站根目錄下,可以用 URL 連到

存放在可被猜到的路徑,能直接在瀏覽器中開啟。

對策:存放在網站根目錄之外/隨機化檔名

↓

4. 伺服器把它當成腳本執行

存放目錄允許執行=web shell → RCE。

對策:在上傳區域禁止執行腳本

每一步都有可以擋下攻擊的地方。縱深防禦的意思是擁有多個這樣的點,而不是依賴單一控制。

不安全的設定與安全的設定

會失守的設定

  • 端點沒有驗證/權限檢查(任何人都能連到)
  • 只依副檔名或 Content-Type 判斷(會被偽造、雙重副檔名)
  • 收到的檔案直接存在網站根目錄下
  • 存放位置仍允許執行腳本
  • 檔名是使用者提供的/可被猜到的

守得住的設定

  • 端點要求驗證+權限+CSRF
  • 用允許清單限制類型,並檢查實際的位元組(magic bytes)
  • 存放在網站根目錄之外(透過專用的處理程式提供)
  • 上傳區域禁止執行腳本
  • 重新命名為隨機檔名;絕不信任使用者提供的路徑

如何實作(依優先順序)

1

在端點要求驗證、權限和 CSRF

處理上傳的端點,必須只有已登入且具備適當權限的使用者才能存取,並且要驗證 CSRF 權杖。據報導,2026 年的 Joomla 案例缺少的正是這個驗證/權限檢查。首先,消除「任何人都能呼叫」的狀態。

2

在伺服器端使用允許清單並檢查內容

絕不信任用戶端的檢查或瀏覽器送出的 Content-Type。在伺服器端用允許清單只允許已知安全的類型,並檢查檔案實際的位元組(magic bytes),確認它真的是那種類型。在判斷之前,先把雙重副檔名、大小寫和結尾的點正規化。

3

存放在網站根目錄之外(或禁止執行)

把收到的檔案存在無法直接用 URL 開啟的地方,透過專用的控制器提供(並設定適當的 Content-Disposition)。如果做不到,至少要在上傳區域禁止執行腳本(網頁伺服器設定)。只要這一點成立,即使是惡意檔案也不會執行。當其他控制失效時,它能保護你。

4

隨機化檔名;加上大小與頻率限制

重新命名為由伺服器決定的隨機名稱,絕不信任使用者提供的路徑或檔名(避免路徑穿越)。加上大小限制和頻率限制,可能的話再加上惡意軟體掃描。

5

盤點並更新你的擴充套件/CMS

盤點你使用的擴充套件/外掛,刪除不使用的,其餘的保持更新。在 2026 年的大規模利用中,攻擊者就是從沒有更新的擴充套件進來的。依照 CVE 修補手冊,加入變更偵測,以便發現問題再次出現。

與本站建置方式的共通之處

這種模式的核心問題,是**把不可信任的輸入,以可以執行的形式放在可以執行的地方。**本站自己的原則正好相反:不信任收到的東西、隔離重要的東西、分層防禦。不只是上傳,「在伺服器端驗證輸入」和「隔離機密與可執行區域」都是同一種防禦。也請參考不要把機密放在公開目錄中的放置錯誤。

延伸閱讀

FAQ

Q為什麼檔案上傳的缺陷會讓攻擊者接管伺服器?
A

如果攻擊者能放置一個伺服器會執行的檔案(腳本),只要在瀏覽器中開啟它,就會在伺服器上執行程式碼(web shell → 遠端程式碼執行,RCE)。接下來就是竄改網頁、竊取資料、偷偷建立管理員帳號,以及擴散到其他系統。關鍵不在於收到了檔案,而在於檔案在它落腳的地方能被執行。

Q檢查副檔名就夠了嗎?
A

不夠。副檔名和瀏覽器送出的 Content-Type 都很容易偽造。雙重副檔名(picture.php.jpg)、大小寫混用、結尾的點或空字元,以及較少人知道的可執行副檔名,都能繞過簡單的檢查。要組合使用允許清單(只允許已知安全的類型)、檢查檔案實際的位元組(magic bytes),而最重要的是讓存放位置不執行任何東西。不要依賴拒絕清單。

Q小網站也會被盯上嗎?
A

會。這類漏洞不需要驗證就能利用,所以攻擊者會掃描整個網際網路,不分對象地攻擊有漏洞的版本。在 2026 年 Joomla 頁面建構器擴充套件的大規模利用中,所有受影響的安裝不論規模都是目標。「我們太小不會被攻擊」並不成立。