Mr-xn/CVE-2026-8054
GitHub: Mr-xn/CVE-2026-8054
该项目详细分析并复现了 dotCMS Core Publish Audit API 中存在的未授权远程 SQL 注入漏洞(CVE-2026-8054)。
Stars: 0 | Forks: 0
# 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
bundleIds) {
// 【漏洞点】没有认证检查!直接调用后端API
try {
final List statuses = auditAPI.getPublishAuditStatuses(bundleIds);
// ...
}
}
}
## 2.3 漏洞核心代码
**文件路径**: `dotCMS/src/main/java/com/dotcms/publisher/business/PublishAuditAPIImpl.java`
**方法**: `getPublishAuditStatuses(List bundleIds)` (第224-245行)
@CloseDBIfOpened
public List getPublishAuditStatuses(List bundleIds)
throws DotPublisherException {
try {
final List result = new ArrayList<>();
DotConnect dc = new DotConnect();
// 【漏洞点1】直接将用户输入拼接到SQL语句中
// 仅添加单引号包裹,没有任何参数化或转义处理
final List 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标签:CISA项目, CVE-2026-8054, dotCMS, JS文件枚举, Web安全, 测试用例, 版权保护, 蓝队分析, 请求拦截