TP5.1 RCE漏洞分析及修复代码

梦明君_4573

梦明君_4573

2026-08-22

709人浏览

原创

thinkphp 5.1系列典型rce漏洞源于反序列化校验缺失,通过windows→conversion→request等类的魔术方法链调用call_user_func_array执行任意命令,修复需禁用危险反序列化、升级至5.1.40+、关闭调试模式并增加入口层拦截。

tp5.1 rce漏洞分析及修复代码

ThinkPHP 5.1 系列存在多个高危 RCE 漏洞,其中最典型的是反序列化触发的远程代码执行(如 CVE-2018-17796、CVE-2019-10904 及后续变种),核心问题在于框架对用户输入的反序列化操作缺乏校验,配合特定类的魔术方法链(__destruct → __toString → __call → call_user_func_array)最终调用危险函数(如 system、exec 或 file_put_contents)。

TP5.1常见RCE触发路径

漏洞多出现在以下场景:

  • 控制器中直接反序列化用户可控数据,例如:unserialize($_GET['data']) 或 unserialize(base64_decode($_POST['a']))
  • 使用了未加固的 Request、Windows、Conversion、Cache 等类参与 POP 链,尤其在 __destruct、__toString、__call 中调用可控制参数的方法
  • 开启调试模式(app_debug=true)且错误页面回显详细信息,便于攻击者探测利用链
  • 版本处于 5.1.0–5.1.30(含)或 5.1.31–5.1.37 中未修复补丁的构建包

典型漏洞复现关键点(以5.1.37为例)

攻击链常从 Windows::__destruct() 入口,调用 removeFiles() → 触发 file_exists($file) → 强制调用 $file->__toString() → 进入 Conversion::__toString() → 调用 toJson() → toArray() → visible() → 最终通过 Request::__call() 执行 call_user_func_array(['system'], ['whoami'])。

有效 payload 示例(需 base64 编码后传参):

KomikoAI
KomikoAI

KomikoAI是一款AI文本写作工具,一站式AI动漫内容创作平台。

下载
O:27:"think\process\pipes\Windows":1:{s:34:"&think\process\pipes\Windows&files";a:1:{i:0;s:23:"phpinfo();";}}

修复方案与加固代码

修复不是打补丁,而是从设计上切断不可信输入进入执行环节。推荐以下四层防御措施:

  • 禁用危险反序列化:绝对禁止对 $_GET、$_POST、$_COOKIE 中任意字段直接调用 unserialize()。如必须反序列化,请先校验签名(如 HMAC-SHA256)并限定白名单类名
  • 升级并锁定框架版本:升级至 ThinkPHP 5.1.40+(官方已移除不安全的 POP 链入口)或直接迁移到 6.x(默认禁用反序列化、增强类型约束)
  • 关闭调试模式上线环境:确保生产环境 config/app.php 中 'app_debug' => false,避免错误泄露类结构和路径
  • 代码层主动拦截:在公共入口或中间件中增加检测逻辑,例如:

// app/middleware/SecurityCheck.php
namespace app\middleware;

use think\Request;

class SecurityCheck
{
    public function handle(Request $request, \Closure $next)
    {
        // 拦截可疑反序列化参数
        if ($request->param('data') && stripos($request->param('data'), 'O:') === 0) {
            abort(400, 'Forbidden: Unsafe serialization detected');
        }
        if ($request->isPost() && $request->post('a')) {
            $a = $request->post('a');
            if (is_string($a) && (stripos($a, 'O:') === 0 || base64_decode($a, true) !== false && stripos(base64_decode($a), 'O:') === 0)) {
                abort(400, 'Serialization input blocked');
            }
        }
        return $next($request);
    }
}

开发规范建议

真正防住 RCE,靠的不是某段代码,而是习惯:

  • 永远假设所有用户输入都是恶意的——包括 URL 参数、HTTP 头、上传文件名、JSON 字段
  • 系统命令调用务必使用白名单 + 参数化方式(如 proc_open() 配合固定参数数组),禁用 system()、exec()、shell_exec() 直接拼接
  • 模板渲染禁用动态表达式(如 {{ $user_input }} 应改为 {{ htmlspecialchars($user_input) }})
  • 定期扫描项目依赖(composer audit)及框架安全公告,订阅 ThinkPHP 官方 GitHub 的 Security Advisories

相关文章

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

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

下载

相关标签:

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

相关专题

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

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

2026.10.22

20

11

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

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

2026.10.22

0

10

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

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

2026.10.22

20

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

20

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

80

12

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

2026.10.22

0

16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程