Sploitus

Exploit for CVE-2026-9811

kitploit · 2026-08-27

Exploit Code

MARKDOWN204 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-AJ2108-CVE-2026-9811
# CVE-2026-9811

CVE-2026-9811 — это уязвимость типа «межсайтовый скриптинг с сохранением» (Stored XSS), затрагивающая Mautic 7 (версии с 7.0.0 по 7.1.1). Уязвимость существует в компоненте Project Selector, где имена проектов, возвращаемые через AJAX-запрос, вставляются на страницу без надлежащего кодирования вывода или санитизации. Аутентифицированный пользователь с разрешением на создание проектов может сохранить вредоносную JavaScript-нагрузку в имени проекта. Когда другой администратор позже открывает редактор сущности, содержащий селектор проекта, вредоносный сценарий выполняется в его браузере.

## Затронутое ПО

**Свойство** **Значение** **Продукт** Mautic **Затронутые версии** 7.0.0 – 7.1.1 **Исправленная версия** 7.1.2 **Компонент** Project Selector **Тип уязвимости** Межсайтовый скриптинг с сохранением (XSS)

## Тип уязвимости

**Категория:** Межсайтовый скриптинг с сохранением (Stored XSS) **CWE-79:** Некорректная нейтрализация входных данных при генерации веб-страницы («Межсайтовый скриптинг») 

## Корневая причина

Приложение сохраняет имена проектов, указанные аутентифицированными пользователями, и позже получает их через AJAX-эндпоинт. При отображении селектора проекта приложение вставляет эти значения непосредственно в DOM в виде HTML-элементов option без экранирования или санитизации содержимого.

Концептуально:

root@kitploit:~
    
    
    User creates project
            │
            ▼
    Project name stored in database
            │
            ▼
    AJAX returns project name
            │
            ▼
    Inserted into DOM without sanitization
            │
            ▼
    Browser executes embedded JavaScript
    

Поскольку приложение доверяет сохранённым данным, вредоносный JavaScript выполняется всякий раз, когда другой привилегированный пользователь загружает уязвимую страницу.

## Схема атаки

root@kitploit:~
    
    
    Attacker
        │
        ▼
    Creates a project with a malicious JavaScript payload as its name
        │
        ▼
    Payload is stored in the database
        │
        ▼
    Administrator opens an entity editor
        │
        ▼
    AJAX request retrieves project names
        │
        ▼
    Application inserts project name into the DOM without encoding
        │
        ▼
    Browser executes the malicious script
        │
        ▼
    Attacker gains actions within the administrator's session
    

## Сценарий атаки

Злоумышленник с разрешением на создание проектов создаёт проект, имя которого содержит вредоносную JavaScript-нагрузку. Позже администратор редактирует другую сущность, включающую Project Selector. Селектор загружает имена проектов через AJAX и вставляет их непосредственно на страницу. Поскольку имя проекта не санитизируется, браузер выполняет встроенный сценарий с правами администратора.

## Пример

**Шаг 1:** Обычное создание проекта 

Представьте, что в Mautic есть форма следующего вида:

root@kitploit:~
    
    
    POST /projects/create HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    
    projectName=Marketing Campaign
    description=Email Campaign
    

Проект сохраняется как:

Marketing Campaign  
**Шаг 2:** Злоумышленник создаёт проект

Вместо обычного имени злоумышленник вводит HTML, содержащий безвредное JavaScript-событие:

root@kitploit:~
    
    
    POST /projects/create HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    
    projectName=<img src="https://raw.githubusercontent.com/aj2108/cve-2026-9811/HEAD/x" onerror="console.log('XSS Demo')">
    description=Test
    

Теперь база данных хранит именно эту строку.

**Шаг 3:** AJAX возвращает сохранённое значение

Позже администратор открывает страницу, которая загружает проекты.

Ответ AJAX:

root@kitploit:~
    
    
    {
        "id": 7,
        "projectName": ""
    }
    

**Шаг 4:** Уязвимый JavaScript

Предположим, приложение делает следующее:

root@kitploit:~
    
    
    const project = response.projectName;
    
    document.getElementById("projects").innerHTML +=
        `<option>${project}</option>`;
    

Браузер видит:

root@kitploit:~
    
    
    <option>
        <img src="https://raw.githubusercontent.com/aj2108/cve-2026-9811/HEAD/x" onerror="console.log('XSS Demo')">
    </option>
    

Поскольку приложение вставило строку как HTML, а не как текст, браузер интерпретирует её как фактический элемент . Изображение не загружается (src="x"), что приводит к выполнению обработчика onerror.

## Воздействие

Успешная эксплуатация может позволить злоумышленнику:

  * Выполнять произвольный JavaScript в браузере другого пользователя.
  * Перехватить сеанс администратора.
  * Выполнять действия от имени администратора.
  * Получать доступ к конфиденциальной информации информационной панели.
  * Изменять данные приложения с использованием привилегий жертвы.

Уязвимость в первую очередь влияет на конфиденциальность и целостность. 

## Серьёзность

Метрика| Оценка  
---|---  
**CVSS v3.1 (CNA)**| **5.4 (Средний)**  
  
NVD ещё не опубликовал собственную оценку CVSS для этой CVE.

## Концептуальный уязвимый код

**Примечание:** Поставщик не опубликовал точный уязвимый исходный код. Приведённый ниже пример лишь иллюстрирует паттерн уязвимости.

root@kitploit:~
    
    
    // Data returned from AJAX
    const project = response.projectName;
    
    // Unsafe: inserted directly into the DOM
    document.getElementById("projectSelector").innerHTML +=
        `<option>${project}</option>`;
    

## Почему это уязвимо

Имя проекта происходит из пользовательского ввода, но вставляется на страницу без HTML-кодирования. Если сохранённое значение содержит HTML или JavaScript, браузер интерпретирует его как исполняемое содержимое, а не как обычный текст.

## Исправленный код (концептуальный)

root@kitploit:~
    
    
    const option = document.createElement("option");
    
    // Safe: assign as text, not HTML
    option.textContent = response.projectName;
    
    document.getElementById("projectSelector").appendChild(option);
    

Или, если вывод HTML неизбежен, обеспечьте надлежащее кодирование вывода перед вставкой.

## Почему это исправление работает

Использование `textContent` (или эквивалентного безопасного API) гарантирует, что любые специальные символы обрабатываются как обычный текст, а не как исполняемый HTML или JavaScript. Даже если вредоносное имя проекта сохранено в базе данных, оно будет отображаться буквально, а не выполняться.