ThinkPHP 3.2.1存在高危RCE漏洞,本质是路由参数(如s、_method)校验缺失,攻击者可构造恶意请求触发system等函数执行;修复需关闭APP_DEBUG、入口层过滤危险参数、禁用危险函数、停用File缓存并限制Runtime目录权限。

ThinkPHP 3.2.1 存在高危函数执行漏洞,本质是框架对用户输入的路由参数(如 s、_method)和控制器调用逻辑缺乏严格校验,攻击者可构造类似 /index.php?s=/Index/ hinkpp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id 的请求,直接触发任意系统命令执行。该版本未修复 CVE-2018-20062 及其变种,且默认开启调试模式、允许动态类名解析、支持 preg_replace('/.*/e') 等危险语法,风险极高。
关闭 APP_DEBUG 并禁用调试输出
生产环境必须确保 'APP_DEBUG' => false 全局生效。该配置一旦开启,框架会暴露路径、类结构、错误上下文,并放宽对 s 参数的合法性检查,极大降低 RCE 利用门槛。检查 Application/Common/Conf/config.php 及所有模块级配置文件,删除或覆盖任何 'APP_DEBUG'=>true 的定义。同时确认 display_errors = Off、log_errors = On 在 php.ini 中已设置,防止错误信息泄露敏感路径。
在入口层拦截高危参数与非法路由
在 public/index.php 文件最顶部( 后立即插入),添加如下参数过滤逻辑:
- 拦截
s、_method、function、vars等关键参数中出现的危险关键词 - 禁止反斜杠
、点号.、花括号{}、美元符$、双冒号::等用于类/方法注入的符号 - 示例代码:
if (isset($_GET['s']) && preg_match('/[\\\.\$\{\}|]|(think\\|invokefunction|call_user_func|eval|assert|system|shell_exec)/i', $_GET['s'])) { header('HTTP/1.1 403 Forbidden'); exit('Access denied.'); } if (isset($_GET['_method']) && preg_match('/[\\\.\$\{\}|]|(call_user_func|eval|system)/i', $_GET['_method'])) { header('HTTP/1.1 403 Forbidden'); exit('Invalid method.'); }
禁用危险函数并限制运行环境能力
编辑服务器 php.ini,在 disable_functions 行追加:exec,passthru,shell_exec,system,proc_open,popen,curl_exec,pcntl_exec,dl
重启 PHP-FPM 或 Apache/Nginx 服务使配置生效。注意确认业务无依赖这些函数(如部分日志推送、异步任务),如有,应改用安全替代方案(如 file_get_contents() 替代 file_get_contents() + curl_exec() 组合)。
停用 File 缓存并清理 Runtime 目录
ThinkPHP 3.2.1 的 File 缓存驱动可被写入 .php 后缀缓存文件,成为 RCE 落地载体。在 Application/Common/Conf/config.php 中强制设置:
'DATA_CACHE_TYPE' => 'Apc', // 或 'Memcache'、'Redis' 'TMPL_CACHE_ON' => false, 'DB_FIELD_CACHE' => false
随后手动清空 Runtime/Temp/ 和 Runtime/Cache/ 目录,并通过操作系统权限限制:
chmod 750 Runtime/Temp/ chown www-data:www-data Runtime/Temp/
确保 Web 进程可写但不可执行,彻底阻断缓存型 RCE 链路。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











