TP5.0控制器漏洞本质是缺乏控制器名与方法名白名单校验,导致RCE;须从入口拦截(硬性过滤关键词)、格式校验(正则限制命名)、配置加固(关闭debug/auto_route等)三方面同步修复并验证。

TP5.0控制器漏洞本质是框架对用户输入的控制器名、方法名缺乏白名单校验,导致攻击者可绕过路由直接调用内部类方法(如think\app/invokefunction),进而执行任意PHP函数。修复不能只打补丁,必须从入口拦截、配置加固、代码清理三方面同步推进。
立即堵住RCE入口路径
以下两类请求必须在Web服务器或入口文件中硬性拦截,不进入框架层:
- 含
\think\、invokefunction、call_user_func、__construct等关键词的s=参数(如/index.php?s=index/\think\app/invokefunction) - GET/POST中带
_method=__construct且同时存在filter[]=的组合(如?_method=__construct&filter[]=system&server[REQUEST_METHOD]=id) - 建议在
public/index.php顶部添加正则匹配并直接exit(403),比依赖中间件更可靠
强制校验控制器与方法名格式
在think\App类的module()方法中,控制器名提取后必须加严格正则过滤:
- 原始逻辑:
$controller = Loader::parseName($controller, 1, true); - 修复后追加:
if (!preg_match('/^[A-Za-z][\w.]*$/', $controller)) { throw new HttpException(404, 'controller not exists: ' . $controller); } - 注意:该正则禁止数字开头、中文、特殊符号及反斜杠,覆盖所有已知绕过方式
关闭高危配置与调试开关
这些设置若残留,等于为漏洞提供温床:
- 确认
config/app.php中'app_debug' => false、'url_route_on' => true(强制路由)、'url_param_type' => 0(禁用顺序解析)三项均为false或true,不可注释或留空 - 删除
runtime/log/下全部日志文件,并在Nginx/Apache中禁止直接访问/runtime/目录下的.log和.php文件 - 检查是否启用
auto_route,若存在必须设为false;该功能默认开启且无校验,是RCE高频入口
验证修复是否生效
不能只看版本号或状态码,要重放真实POC:
- 用curl发送原始攻击载荷:
curl "http://your.com/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=1",响应必须为404或空白页,且PHP错误日志中无phpinfo调用痕迹 - 测试变种路径:
/index.php?s=/runtime/log/202608/15.log(日志包含)、/index.php?c=Index&a=display(空操作绕过),均应返回404 - 运行
tpscan -u http://your.com --level 3,输出中不得出现[RCE]或[ROUTE]标记

















