【PHPGGC】CodeIgniter4反序列化链
字数 1344 2025-08-09 13:33:40
CodeIgniter4 反序列化漏洞分析与利用
漏洞概述
本文详细分析 CodeIgniter4 框架中的反序列化漏洞,包括两条远程代码执行(RCE)链和一条文件删除(FD)链。这些漏洞存在于框架的核心组件中,通过精心构造的反序列化数据可实现任意代码执行或文件删除。
环境搭建
RCE1 环境 (CodeIgniter4.0.0-rc.4)
docker-compose up -d
访问 http://x.x.x.x/ 看到 "hello world" 即搭建成功
RCE2/FD1 环境 (CodeIgniter4.0.4)
使用相同环境搭建方式
测试代码
<?php namespace App\Controllers;
class Home extends BaseController
{
public function index()
{
if(isset($_POST['a']))
{
unserialize(base64_decode($_POST['a']));
}
else
{
return "hello world";
}
}
}
漏洞链分析
RCE1 调用链
system/Cache/Handlers/RedisHandler.php::__destructsystem/Session/Handlers/MemcachedHandler.php::closesystem/Model.php::deletesystem/Model.php::triggersystem/Model.php::validatesystem/Validation/Validation.php::runsystem/Validation/Validation.php::processRules(命令执行点)
RCE2 调用链
与 RCE1 相同,但部分代码逻辑有细微差异
FD1 调用链
system/Cache/Handlers/RedisHandler.php::__destructsystem/Session/Handlers/MemcachedHandler.php::closesystem/Cache/Handlers/FileHandler.php::delete(文件删除点)
关键漏洞点分析
1. 反序列化入口点 (__destruct)
在 RedisHandler.php 中找到可利用的 __destruct 方法:
public function __destruct()
{
if ($this->redis)
{
$this->redis->close();
}
}
2. 调用任意 close 方法
通过 MemcachedHandler.php 的 close 方法:
public function close(): bool
{
if (isset($this->memcached))
{
isset($this->lockKey) && $this->memcached->delete($this->lockKey);
// ...
}
}
3. 调用任意 delete 方法
对于 RCE 链:
利用 Model.php 的 delete 方法:
public function delete($id = null, bool $purge = false)
{
// ...
$this->trigger('beforeDelete', ['id' => $id, 'purge' => $purge]);
// ...
}
对于 FD 链:
利用 FileHandler.php 的 delete 方法直接删除文件:
public function delete(string $key)
{
$key = $this->prefix . $key;
return is_file($this->path . $key) && unlink($this->path . $key);
}
4. trigger 方法控制流
Model.php 的 trigger 方法允许调用任意方法:
protected function trigger(string $event, array $eventData)
{
foreach ($this->{$event} as $callback)
{
$eventData = $this->{$callback}($eventData);
}
return $eventData;
}
5. validate 方法中的规则处理
通过 validate 方法进入验证流程:
public function validate($data): bool
{
// ...
$this->validation->setRules($rules, $this->validationMessages);
$valid = $this->validation->run($data, null, $this->DBGroup);
// ...
}
6. 最终命令执行点
在 processRules 方法中存在可执行任意代码的点:
protected function processRules(string $field, string $label = null, $value, $rules = null, array $data): bool
{
foreach ($rules as $rule)
{
if (is_callable($rule))
{
$passed = $param === false ? $rule($value) : $rule($value, $param, $data);
}
}
}
利用条件
- 存在反序列化入口点
- 应用程序使用了易受攻击的 CodeIgniter4 版本
- 相关类文件被加载
防护建议
- 避免反序列化用户可控的数据
- 及时更新到最新版本的 CodeIgniter
- 对反序列化操作进行严格的白名单控制
总结
CodeIgniter4 的反序列化漏洞链展示了框架组件间复杂的交互可能带来的安全隐患。通过分析这些漏洞链,我们可以更好地理解反序列化漏洞的利用原理,并在开发中采取相应的防护措施。