iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
Security

跨出第一步:D 從0到0.1的Web security 系列 第 18

Day 17: 網站的最高權限!什麼是 RCE (遠端程式碼執行)?

  • 分享至 

  • xImage
  •  

今天深入:網站的「最高權限」與最致命的漏洞 — RCE

今天我們來深入探討一下網站的最高權限,以及達成這個目標的最致命漏洞——RCE


網站的「最高權限」是什麼?

首先,要釐清一個觀念:網站的最高權限並不是指網站後台的「管理員 (Admin)」帳號。

雖然拿到 Admin 帳號可以讓你管理網站內容、使用者,但你的權力仍然被限制在應用程式本身設計的功能框架內。你無法直接接觸到運行這個網站的底層伺服器。

在滲透測試和駭客攻擊的語境中,網站的最高權限指的是取得網站伺服器作業系統的互動式控制權,也就是獲得一個「Shell」

獲得 Shell 意味著:

  • 你可以像系統管理員一樣,直接在伺服器的命令列 (Command Line) 介面下達指令。
  • 你可以執行任意的系統命令,例如 ls -la(列出所有檔案)、cat /etc/passwd(讀取使用者列表)、whoami(查看當前使用者身份)。
  • 你可以讀取、寫入、修改伺服器上的任何檔案,包括網站原始碼、設定檔、資料庫連線資訊等。
  • 你可以安裝自己的軟體,例如安裝後門程式、挖礦程式,或者將這台伺服器當作跳板,去攻擊內部網路的其他主機。

簡單來說,拿到 Shell 就等於完全佔領了這台伺服器。而 RCE,就是達成這個目標最直接、最有效的方式。


什麼是 RCE(遠端程式碼執行)?

RCE(Remote Code Execution),中文譯為「遠端程式碼執行」。

它是一種安全漏洞,允許攻擊者在遠端的目標伺服器上,執行任意的程式碼或系統命令。

  • Remote(遠端):攻擊者不需要物理接觸伺服器,也不需要事先擁有任何帳號密碼。他們可以透過網際網路,經由網站應用程式本身存在的漏洞來觸發攻擊。
  • Code Execution(程式碼執行):攻擊者執行的指令是以網站應用程式或伺服器本身的權限來運行的。

可以把它想像成:攻擊者發現了一個方法,能將他自己電腦上的鍵盤,遠端連接到你伺服器的命令列上。他敲的每一個指令,你的伺服器都會乖乖照做。

RCE 被認為是最嚴重的漏洞類別之一,因為一旦成功利用,它幾乎等同於遊戲結束(Game Over)。攻擊者可以立即實現上述的「最高權限」,完全控制伺服器。


RCE 是如何發生的?(常見的攻擊向量)

RCE 的成因多種多樣,但通常都與「未經嚴格驗證就處理使用者輸入」這個核心問題有關。以下為常見向量:

1. 命令注入(Command Injection)

這是最直接的 RCE 形式。當應用程式需要執行系統命令,並且將使用者可控的輸入,不安全地拼接進命令字串中時,就會發生此漏洞。

情境範例:一個網站功能,讓使用者可以輸入 IP 位址來執行 ping 檢測。

不安全的 PHP 程式碼

<?php
  $ip = $_GET['ip']; // 直接從 URL 取得 IP
  system("ping -c 4 " . $ip); // 將 IP 直接拼接到 system() 函式中
?>

攻擊者的惡意輸入:使用者不輸入正常的 IP,而是輸入 127.0.0.1; ls -la

伺服器實際執行的命令
ping -c 4 127.0.0.1; ls -la
由於分號 ; 在 Linux shell 中是命令分隔符,伺服器會先執行 ping,然後接著執行攻擊者注入的 ls -la 命令,將當前目錄的檔案列表回傳給攻擊者。攻擊者可以替換 ls -la 為任何他想執行的指令。

2. 不安全的反序列化(Insecure Deserialization)

當應用程式將經過序列化(將物件轉換為字串以便傳輸或儲存)的使用者資料,在未經驗證的情況下進行反序列化(將字串還原為物件)時,攻擊者可以精心建構惡意的序列化字串,在還原成物件的過程中觸發惡意程式碼的執行。這在 Java、PHP、Python 應用中非常常見且極度危險。

3. 危險的檔案上傳(Unrestricted File Upload)

如果網站允許使用者上傳檔案(例如頭像、附件),但沒有嚴格限制上傳檔案的類型和內容,攻擊者就可以上傳一個「Web Shell」。

  • Web Shell:一個偽裝成圖片或普通檔案(例如 shell.php),但內容實則是惡意程式碼的檔案。

攻擊流程

  1. 攻擊者上傳一個 shell.php 檔案。
  2. 如果伺服器沒有做好防護,會將此檔案存放在網站的可存取目錄下。
  3. 攻擊者直接透過瀏覽器訪問 https://example.com/uploads/shell.php
  4. Web 伺服器(如 Apache)看到是 .php 檔案,就會用 PHP 直譯器去執行它,而不是把它當作普通檔案顯示。
  5. shell.php 內的程式碼被執行,通常會提供一個讓攻擊者可以方便地下達系統命令的網頁介面。

4. 第三方軟體或函式庫的漏洞

現代網站大量依賴各種框架、函式庫與中介軟體。如果這些第三方元件本身存在 RCE 漏洞,那麼使用它們的網站也會跟著遭殃。近年來許多重大的資安事件都屬於此類:

  • Log4Shell(CVE-2021-44228):Java 生態系中廣泛使用的日誌記錄工具 Log4j 存在 RCE 漏洞。
  • Apache Struts2:過去曾爆發多個嚴重的 RCE 漏洞,是許多駭客攻擊的首選目標。

如何防禦 RCE?

防禦 RCE 需要採取縱深防禦策略(defense-in-depth)。以下是實務上應採取的重要措施:

  1. 永不信任使用者輸入:對所有來自外部的輸入,進行嚴格的驗證、過濾與逸出(Sanitization & Escaping),這是最重要的原則。

  2. 避免直接呼叫系統命令:盡可能使用語言內建的函式來處理功能,而不是將使用者輸入拼接到 system()exec() 等高風險函式中。

  3. 安全地處理檔案上傳

    • 使用白名單驗證檔案副檔名與 MIME 類型。
    • 重新命名上傳的檔案,避免使用使用者提供的檔名。
    • 將上傳的檔案存放在網站根目錄(Web Root)之外,使其無法被直接透過 URL 訪問執行。
  4. 及時更新與修補:保持作業系統、Web 伺服器、應用程式框架、所有函式庫與外掛程式到最新版本,是防禦已知 RCE 漏洞的關鍵。

  5. 最小權限原則:讓 Web 服務以一個低權限的專用帳號(例如 www-data)運行,即使攻擊者成功 RCE,他們初始獲得的權限也有限,可以延緩他們進一步的破壞。


RCE 是網站安全滲透的最終目的之一。它代表著防禦的全面失守,能讓攻擊者從遠端徹底奪取伺服器的控制權。防禦 RCE 需要從源頭的程式碼安全開發,到日常的系統維運管理,都保持高度的警覺與紀律。

明天我們就來討論 xss的攻擊原理。


上一篇
Day 16: Web 滲透測試策略
下一篇
• Day 18: 我的留言怎麼變成了惡意腳本?淺談 XSS
系列文
跨出第一步:D 從0到0.1的Web security 20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言