PHP - Deserialization + Autoload Classes
Спочатку вам слід перевірити, що таке Автозавантаження Класів.
PHP десеріалізація + spl_autoload_register + LFI/Gadget
Ми опинилися в ситуації, де ми знайшли десеріалізацію PHP в веб-додатку без бібліотеки, яка має вразливі гаджети всередині phpggc
. Однак у тому ж контейнері був інший веб-додаток композитора з вразливими бібліотеками. Тому метою було завантажити завантажувач композитора іншого веб-додатка і використати його для завантаження гаджета, який використовуватиме ту бібліотеку з гаджетом з веб-додатка, вразливого до десеріалізації.
Кроки:
Ви знайшли десеріалізацію і в поточному додатку немає гаджетів
Ви можете використати функцію
spl_autoload_register
, подібну до наступної, щоб завантажити будь-який локальний файл з розширенням.php
Для цього ви використовуєте десеріалізацію, де ім'я класу буде в
$name
. Ви не можете використовувати "/" або "." в імені класу в серіалізованому об'єкті, але код замінює підкреслення ("_") на косі слеші ("/"). Таким чином, ім'я класу, наприклад,tmp_passwd
, буде перетворено на/tmp/passwd.php
, і код спробує його завантажити. Приклад гаджета:O:10:"tmp_passwd":0:{}
Якщо у вас є завантаження файлів та ви можете завантажити файл з розширенням .php
, ви можете зловживати цією функціональністю безпосередньо та вже отримати RCE.
У моєму випадку нічого подібного не було, але всередині того ж контейнера була інша сторінка веб-сайту композитора з бібліотекою, яка має вразливість до гаджета phpggc
.
Щоб завантажити цю іншу бібліотеку, спочатку вам потрібно завантажити завантажувач композитора того іншого веб-додатка (тому що поточний додаток не матиме доступу до бібліотек іншого). Знаючи шлях до додатка, ви можете це зробити дуже легко за допомогою:
O:28:"www_frontend_vendor_autoload":0:{}
(У моєму випадку завантажувач композитора був у/www/frontend/vendor/autoload.php
)Тепер ви можете завантажити завантажувач іншого додатка, тому час
згенерувати пейлоад phpgcc
для використання. У моєму випадку я використовувавGuzzle/FW1
, що дозволило мені записати будь-який файл всередині файлової системи.ПРИМІТКА: Згенерований гаджет не працював, щоб він працював, я змінив цей пейлоад
chain.php
phpggc та встановив всі атрибути класів з приватних на публічні. Якщо цього не зробити, після десеріалізації рядка атрибути створених об'єктів не матимуть жодних значень.Тепер у нас є спосіб завантажити завантажувач композитора іншого додатка та мати пейлоад phpggc, який працює, але нам потрібно зробити це в ОДНОМУ ЗАПИТІ, щоб завантажувач був завантажений при використанні гаджета. Для цього я відправив серіалізований масив з обома об'єктами таким чином:
Ви можете побачити, спочатку завантажується завантажувач, а потім пейлоад
Опис навантаження
Завантажте автозавантаження композитора іншого веб-додатка в тому ж контейнері
Завантажте гаджет phpggc, щоб зловживати бібліотеку з іншого веб-додатка (початковий веб-додаток, який вразливий на десеріалізацію, не мав жодного гаджета у своїх бібліотеках)
Гаджет створить файл з PHP навантаженням на ньому в /tmp/a.php з шкідливими командами (користувач веб-додатка не може записувати в будь-яку папку будь-якого веб-додатка)
Остання частина нашого навантаження використовуватиме завантажте згенерований php-файл, який виконає команди
Мені потрібно було викликати цю десеріалізацію двічі. У моїх тестах перший раз файл /tmp/a.php
був створений, але не завантажений, і другий раз він був правильно завантажений.
Last updated