TP5.0控制器漏洞分析及修复代码

落墨君_1789

落墨君_1789

2026-08-24

777人浏览

原创

ThinkPHP 5.0控制器存在RCET、method覆盖命令执行、路由解析绕过和输入修饰符SQL注入四大高危漏洞;需分别通过拦截危险路径、校验HTTP方法、强制关闭自动路由并验证控制器名格式、严格校验数组型输入来修复。

tp5.0控制器漏洞分析及修复代码

ThinkPHP 5.0 控制器层面存在多个高危漏洞,核心问题集中在路由解析、方法调用和参数处理三个环节。不修复就升级或长期运行,极易被利用执行任意命令、读取敏感文件甚至写入WebShell。

控制器名未校验导致RCE

TP5.0默认允许通过URL路径直接传入控制器名(如 /index.php?s=/index/ hinkpp/invokefunction),且未对控制器命名做白名单限制。攻击者可拼接框架内部类路径,触发invokeFunction等危险逻辑。

  • 在入口文件 public/index.php 或全局中间件中添加硬性拦截规则
  • 匹配含 hink、invokefunction、call_user_func、eval 的请求参数,直接返回404或中断执行
  • 示例代码(加在 App::run() 前):
if (isset($_GET['s']) && preg_match('/[\\\\]|(think|invoke|call_user|eval|system|exec)/i', $_GET['s'])) {
  header('HTTP/1.1 404 Not Found');
  exit('Invalid controller path');
}

method变量覆盖引发命令执行

当 _method=__construct 与可控 filter[] 同时提交时,Request对象的 __construct 方法会遍历POST数据做属性赋值,覆盖 $this->method 和 $this->filter,最终在参数过滤阶段调用 system、phpinfo 等函数。

稿定AI文案
稿定AI文案

一款面向中文内容创作的AI文案工具,支持小红书、公众号、周报和视频脚本等多种常见写作场景。

下载
  • 必须禁用生产环境的 app_debug 和 var_method 配置
  • 修改 thinkphp/library/think/Request.php 中的 method() 方法,在解析 var_method 参数后增加白名单校验
  • 关键修复段(替换原 method 方法中 POST 解析部分):
if (isset($_POST[Config::get('var_method')])) {
  $method = strtoupper($_POST[Config::get('var_method')]);
  if (!in_array($method, ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'])) {
    throw new HttpException(400, 'Invalid HTTP method');
  }
  $this->method = $method;
  if (isset($_POST)) {
    foreach ($_POST as $key => $val) {
      if ($key === Config::get('var_method')) unset($_POST[$key]);
    }
  }
}

路由自动解析绕过权限控制

开启 url_route_on=false 且 url_param_type=1 时,框架退化为“顺序解析”模式,但部分版本仍残留控制器名动态拼接逻辑,导致未定义控制器被加载或方法被误调用。

  • 检查并强制关闭自动路由:'url_route_on' => false 必须出现在 config/app.php
  • 在 thinkApp 类的 module() 方法中,控制器名提取后立即校验格式
  • 修复代码(插入在 $controller = Loader::parseName($controller, 1, true); 后):
$pattern = '/^[A-Za-z][A-Za-z0-9]*$/';
if (!preg_match($pattern, $controller)) {
  throw new HttpException(404, 'Controller name is invalid: ' . $controller);
}

输入修饰符滥用引发SQL注入

使用 input('id/a') 强制接收数组,再直接用于 where('id','in',$id),若未过滤或校验,攻击者可构造 id[0,updatexml(0,concat(0x5e,user()),0),0] 触发报错注入。

  • 禁止无条件使用 /a 修饰符接收用户输入
  • 数组型参数必须做元素类型与长度双重校验
  • 推荐写法(替代原始 input("id/a")):
$id = input('id/a', []);
if (!is_array($id) || count($id) > 100) {
  throw new HttpException(400, 'Invalid id format');
}
foreach ($id as $v) {
  if (!is_numeric($v) || $v 9999999) {
    throw new HttpException(400, 'Invalid id value');
  }
}
$data = Db::name('users')->where('id', 'in', $id)->select();

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

0

17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

100

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

80

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

240

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

140

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

100

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
THINKPHP 5.0 手册最新版
THINKPHP 5.0 手册最新版

共213课时 | 55.5万人学习