ThinkPHP 3.2.4存在RCE漏洞,典型入口是$_GET['_method']配合call_user_func_array();临时防护需在index.php入口拦截高危参数、禁用exec等危险函数、关闭File缓存并限制Runtime/Temp目录执行权限。

ThinkPHP 3.2.4 存在多个可被利用的代码执行(RCE)入口,其中最典型的是 $_GET['_method'] 参数配合 call_user_func_array() 触发任意函数调用。该漏洞在全版本 3.2.x 中均存在,无需登录、无需特殊权限,仅需构造特定请求即可执行系统命令。临时防护目标不是彻底修复,而是在无法立即升级或修改框架源码的前提下,快速阻断主流攻击路径,保障线上服务基本安全。
入口层参数拦截(最直接有效)
在 public/index.php 入口文件顶部(<?php 之后、任何框架加载之前)添加以下过滤逻辑:
- 检查
_method、s、function、vars等高危参数是否存在于$_GET或$_POST - 若存在且值中包含反斜杠
或关键词think、call_user_func、eval、system等,立即终止请求 - 示例代码(可直接粘贴):
if (isset($_GET['_method']) && preg_match('/[\\\$`~\x00-\x1f\x7f-\xff]|(think\\|call_user_func|eval|assert|system|shell_exec)/i', $_GET['_method'])) {<br> header('HTTP/1.1 400 Bad Request');<br> exit('Invalid request.');<br>}
禁用危险函数(系统级兜底)
通过 PHP 配置限制底层执行能力,从运行环境层面削弱 RCE 杀伤力:
立即学习“PHP免费学习笔记(深入)”;
- 编辑服务器 php.ini,定位
disable_functions行,追加:disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,pcntl_exec - 重启 PHP-FPM 或 Web 服务(如 Apache/Nginx)使配置生效
- 注意:该操作影响全局,需确认业务无依赖上述函数(如部分日志推送、异步任务可能受影响)
关闭模板与数据缓存(防缓存型 RCE)
ThinkPHP 3.2.3–3.2.4 的 File 缓存驱动 存在序列化注入漏洞(CVE-2018-14574 变种),攻击者可通过 S() 写入恶意缓存文件并触发 RCE。临时缓解需双管齐下:
- 在 application/Common/Conf/config.php 中强制关闭相关缓存:
'DATA_CACHE_TYPE' => 'Apc', // 或 'Xcache',避免使用 'File'<br>'TMPL_CACHE_ON' => false,<br>'DB_FIELD_CACHE' => false
- 清空 Runtime/Temp/ 目录(该目录存放 .php 后缀缓存文件,是主要攻击载体)
限制 Runtime 目录可执行权限(操作系统层加固)
即使缓存文件被写入,若服务器禁止其执行,也能阻断多数 RCE 利用链:
- Linux 下执行(以宝塔面板常见路径为例):
chmod -R 644 /www/wwwroot/your-site/Application/Runtime/Temp/<br>chown -R www:www /www/wwwroot/your-site/Application/Runtime/Temp/
- 关键点:确保 Temp 目录及其子文件无 x(执行)权限,且属主为 Web 进程用户(如 www)
- 验证方式:尝试访问
/Application/Runtime/Temp/xxx.php,应返回 403 或 404,而非解析执行



















