thinkphp 6.1.3 中的 cve-2024-44902 是一个反序列化命令执行漏洞,攻击者可以通过构造特定的恶意输入触发远程代码执行。该漏洞的核心在于 think\session\driver\cache 类中 read() 方法对会话数据的处理逻辑存在缺陷,当使用支持序列化的缓存驱动(如 redis、memcached)时,若攻击者能够控制会话数据或获取序列化字符串的生成入口,即可通过反序列化链执行任意命令。

漏洞触发的具体条件是什么?
要利用此漏洞,必须满足两个关键条件:一是应用配置了支持序列化的会话存储驱动(例如 redis 或 memcached),二是攻击者能够向服务器发送包含恶意序列化数据的请求。通常,这需要通过 CSRF 攻击诱导用户点击链接,或者在已知会话 ID 的情况下直接修改会话数据。漏洞利用的关键在于 think\session\driver\Cache 类的 read() 方法会调用 PHP 的 unserialize() 函数解析会话数据,而 ThinkPHP 框架中存在一条可用的 Gadget Chain( gadgets 链),可以将反序列化过程转化为命令执行。

config/session.php
return [
'type' => 'redis', // 必须使用支持序列化的驱动
'handler' => 'redis',
'connect' => ['server' => '127.0.0.1:6379'],
];
// 攻击者构造的恶意 Payload (简化示意)
$payload = serialize(new think\process\pipes\Windows([new ReflectionClass('think\facade\App')]));
// 将 payload 存入 Redis 会话存储中
上述代码展示了如何配置一个易受攻击的会话驱动。在实际利用中,攻击者不需要直接运行这段代码,而是需要构造一个包含恶意对象的序列化字符串,并将其注入到会话存储中。当用户访问网站时,ThinkPHP 会尝试读取并反序列化该会话数据,从而触发漏洞。需要注意的是,如果会话驱动是文件类型(file),则无法利用此漏洞,因为文件驱动不使用序列化。
立即学习“PHP免费学习笔记(深入)”;
为什么 Redis 驱动会导致命令执行?
Redis 驱动本身并不直接导致命令执行,问题出在 ThinkPHP 框架内部的反序列化链上。当 think\session\driver\Cache 从 Redis 中取出数据并进行反序列化时,它会遍历对象属性。ThinkPHP 6.x 版本中存在一个名为 think\process\pipes\Windows 的类,其构造函数或析构函数中调用了 proc_open() 或类似系统命令执行的函数。如果攻击者能控制传入反序列化器的对象图,使其最终实例化这个类并传入恶意参数,就能实现命令执行。此外,think\cache\driver\Redis 类中的某些方法也可能被利用来辅助构建这条链。

// 验证漏洞存在的简单测试脚本 (仅限本地环境)
<?php
require 'vendor/autoload.php';
use think\Session;
// 模拟设置会话
Session::init(['type' => 'redis', 'handler' => 'redis', 'connect' => ['server' => '127.0.0.1:6379']]);
// 构造恶意负载
$gadget = new think\process\pipes\Windows([new ReflectionClass('think\facade\App')]);
$serialized = serialize($gadget);
// 手动写入 Redis (实际攻击中可能通过其他方式)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('sess_' . 'test_session_id', $serialized);
// 触发反序列化
Session::start();
Session::id('test_session_id');
$data = Session::get(); // 这里会触发 read() 和 unserialize()
?>
这个示例脚本演示了如何利用 Redis 驱动触发反序列化。它首先初始化了一个基于 Redis 的会话管理器,然后构造了一个恶意的 Windows 管道对象,该对象在创建时会尝试执行系统命令。接着,脚本将这个对象序列化为字符串,并手动将其存储到 Redis 中。最后,通过启动会话并指定 ID,强制 ThinkPHP 读取并反序列化该数据,从而触发漏洞。在实际环境中,攻击者通常会结合其他漏洞(如 XSS 或 CSRF)来获取用户的会话 ID 或诱导其访问特定页面。
如何修复 CVE-2024-44902 漏洞?
修复此漏洞最直接的方法是升级 ThinkPHP 到最新版本,官方已在后续版本中修复了相关的反序列化安全问题。如果暂时无法升级,可以采取以下临时措施:一是将会话驱动更改为不支持序列化的类型,例如使用 file 驱动;二是在全局中间件或入口文件中禁用自动会话启动,改为手动管理会话生命周期,并在必要时对会话数据进行严格的白名单校验;三是启用 PHP 的 disable_functions 配置,禁止 proc_open、exec、system 等危险函数的执行。这些措施可以有效阻断攻击者利用反序列化链执行命令的路径。



















