thinkphp 3.2.2存在高危rce漏洞,典型为路由参数s控制的动态方法调用(如/invokefunction)和preg_replace /e修饰符漏洞,无需登录即可通过恶意url触发;防护需关闭app_debug、过滤s参数、禁用危险函数、升级框架或web服务器层拦截。

ThinkPHP 3.2.2 存在多个可导致任意代码执行(RCE)的高危漏洞,其中最典型的是 路由参数 s 控制的动态方法调用漏洞(CVE-2018-20062 前身)和 preg_replace /e 修饰符代码执行漏洞。这些漏洞无需登录、不依赖数据库,仅通过构造恶意 URL 即可触发 PHP 代码执行,危害极大。防护不能只靠“打补丁”,需从配置、代码、部署三层面协同加固。
关闭调试模式并禁用危险配置
生产环境必须确保 APP_DEBUG = false,这是最基础且关键的一环。该配置开启时,框架会暴露详细错误堆栈、路径信息,并放松对路由参数的校验逻辑,直接放大 RCE 利用成功率。同时检查以下配置项:
-
URL_ROUTER_ON:如非必要,设为
false;若必须开启,需配合严格白名单路由规则 - DEFAULT_MODULE / DEFAULT_CONTROLLER / DEFAULT_ACTION:避免使用用户可控变量动态赋值
-
DATA_CACHE_TYPE:禁用
File缓存驱动(尤其避免写入.php后缀缓存文件),改用Memcache或Redis
过滤路由与输入参数
ThinkPHP 3.2.2 默认未对 `s` 参数做合法性校验,攻击者可传入 /Index/ hinkpp/invokefunction 等路径绕过常规控制器限制。应在入口文件或公共行为中主动拦截非法字符和路径结构:
- 对 `$_GET['s']` 和 `$_SERVER['PATH_INFO']` 进行正则匹配,仅允许字母、数字、下划线、斜杠,禁止反斜杠
、点号.、花括号${}、美元符$等敏感符号 - 禁用所有含
hink、org、invokefunction、call_user_func、assert、system等关键词的路由路径 - 重写
I()函数,在获取 `s`、`_method`、`filter` 等高危参数时强制清空或转义
升级或替换存在风险的组件
3.2.2 是已知高危版本,官方早在 3.2.3 后陆续修复了部分问题(如缓存写入漏洞),但仍有未覆盖的 RCE 风险。强烈建议:
- 升级至 ThinkPHP 3.2.4+(如有官方维护分支),或更稳妥地迁移至 ThinkPHP 5.1.40+ / 6.x 版本,其路由解析、输入过滤、模板引擎机制已重构,大幅降低 RCE 概率
- 若无法升级,应手动替换存在 `/e` 修饰符的
preg_replace调用——搜索项目中所有preg_replace('/.*?/e', ...),改为preg_replace_callback+ 显式函数处理 - 禁用所有自定义模板标签中可能执行 PHP 代码的语法(如
${@phpinfo()}),在视图层统一使用htmlspecialchars()输出变量
Web服务器层加固(最后一道防线)
即使应用层有疏漏,也能通过 Web 服务器规则阻断常见攻击载荷:
-
Apache:在
.htaccess或虚拟主机配置中添加RewriteCond %{QUERY_STRING} (s=|/ hink\|invokefunction|call_user_func_array|preg_replace.*?/e) [NC]+RewriteRule ^ - [F] -
Nginx:在 server 块中加入
if ($args ~* "(s=|\think\\|invokefunction|call_user_func_array|preg_replace.*?/e)") { return 403; } - 限制
Runtime/、Cache/、Temp/目录的脚本执行权限(如 Nginx 中设置location ~ ^/(Runtime|Cache|Temp)/.*.(php|php5|phtml)$ { deny all; })
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











