Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-8181 — Le plugin Burst Statistics – Privacy-Friendly WordPress Analytics (alternative à Google Analytics) pour WordPress est vulnérable au contournement de l’authentification. | Kitploit
Outils/GitHubGitHub/yucaerin/cve-2026-8181
Analyse des VulnérabilitésExploitationExploitation d'Applications WebCTFTests d'IntrusionAuthentificationApprentissage et Éducation
GitHubyucaerin/cve-2026-8181

CVE-2026-8181

Le plugin Burst Statistics – Privacy-Friendly WordPress Analytics (alternative à Google Analytics) pour WordPress est vulnérable au contournement de l’authentification.

Voir le dépôt
19il y a 4 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-8181 — Burst Statistics 3.4.0 – 3.4.1.1 — Contournement d'authentification menant à la prise de contrôle du compte administrateur

Résumé de la vulnérabilité

Le plugin WordPress Burst Statistics versions 3.4.0 à 3.4.1.1 est vulnérable à un contournement d'authentification non authentifié qui permet la prise de contrôle complète du compte administrateur. Cette faille critique permet à un attaquant non authentifié connaissant un nom d'utilisateur administrateur de générer un mot de passe d'application WordPress valide pour ce compte en une seule requête HTTP, obtenant ainsi un accès administrateur persistant à l'ensemble du site.

La vulnérabilité provient de la fonction is_mainwp_authenticated() dans class-mainwp-proxy.php. Cette fonction appelle wp_authenticate_application_password() et vérifie uniquement si le résultat est une WP_Error. Elle ne vérifie pas si le résultat est effectivement un objet WP_User réussi. Lorsque le filtre interne de WordPress application_password_is_api_request renvoie false — ce qui se produit lorsque l'appel est effectué en dehors du flux normal d'authentification de l'API REST — la fonction WordPress retourne null au lieu d'un WP_Error ou d'un WP_User. Comme null n'est pas une WP_Error, la vérification passe et l'utilisateur administrateur choisi par l'attaquant est défini comme utilisateur courant via wp_set_current_user().

Une fois que l'utilisateur courant est basculé vers un administrateur, les vérifications de capacité suivantes passent. L'attaquant peut alors accéder au point de terminaison REST /burst/v1/mainwp-auth, qui crée un mot de passe d'application WordPress pour le compte administrateur et le renvoie dans la réponse. Cela donne à l'attaquant un accès administrateur complet et persistant.

Plugin concerné

ChampValeur
Nom du pluginBurst Statistics – Privacy-Friendly WordPress Analytics
Slug du pluginburst-statistics
Versions affectées3.4.0 – 3.4.1.1
Version corrigée3.4.2
Identifiant CVECVE-2026-8181
Score CVSS9.8 (Critique)
Vecteur CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Type de vulnérabilitéContournement d'authentification (Authentification incorrecte)
CWECWE-287 — Authentification incorrecte
ImpactPrise de contrôle complète du site — Prise de contrôle du compte administrateur

Ce que les attaquants peuvent faire

CapacitéImpact
Générer un mot de passe d'application pour n'importe quel administrateurAccès administrateur persistant
Créer de nouveaux comptes administrateurs via l'API RESTProlifération de comptes
Installer des plugins / thèmesExécution de code à distance
Modifier les articles, pages et paramètresDéfiguration du site
Exporter ou supprimer toutes les données du siteDestruction / Exfiltration de données
Accéder aux données WooCommerce / clientsViolation de données

Analyse technique

Initialisation du plugin et porte vulnérable

Burst Statistics s'initialise lors du hook plugins_loaded de WordPress à la priorité 9, dans class-burst.php :

// class-burst.php, ligne 118
if ( $this->has_admin_access() ) {
    $this->admin = new Admin();
    $this->admin->init();
    ...
}

has_admin_access() est le gardien de toutes les fonctionnalités d'administration. Il vérifie la présence de l'en-tête X-BurstMainWP et appelle la fonction vulnérable :

// trait-admin-helper.php, lignes 202-211
if ( isset( $_SERVER['HTTP_X_BURSTMAINWP'] ) && $_SERVER['HTTP_X_BURSTMAINWP'] === '1' ) {
    $mainwp_proxy = new \Burst\Frontend\MainWP_Proxy();

    if ( $mainwp_proxy->is_mainwp_authenticated() ) {
        return burst_loader()->has_admin_access = true;
    }
    ...
}

La fonction vulnérable : is_mainwp_authenticated()

// class-mainwp-proxy.php, lignes 313-342 (vulnérable 3.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 );
        if ( ! $credentials ) {
            return false;
        }
        $parts = explode( ':', $credentials, 2 );
        if ( count( $parts ) !== 2 ) {
            return false;
        }
        $username = $parts[0];
        $password = $parts[1];

        // VULNÉRABLE : wp_authenticate_application_password() renvoie null
        // en dehors du flux d'authentification de l'API REST
        $is_valid = wp_authenticate_application_password( null, $username, $password );

        // BOGUE : Vérifie uniquement si le résultat est WP_Error. null n'est PAS WP_Error → PASSE !
        if ( is_wp_error( $is_valid ) ) {
            return false;
        }

        $user = get_user_by( 'login', $username );
        if ( ! $user || ! user_can( $user, 'manage_burst_statistics' ) ) {
            return false;
        }
        wp_set_current_user( $user->ID );

        return true;
    }

    return false;
}

Pourquoi wp_authenticate_application_password() renvoie null

La fonction interne de WordPress wp_authenticate_application_password() possède un filtre :

if ( ! apply_filters( 'application_password_is_api_request', false ) ) {
    return null;  // Pas une requête API, ignorer l'authentification par mot de passe d'application
}

Lorsqu'elle est appelée en dehors du flux d'authentification de l'API REST, cela renvoie null. Le code de Burst Statistics vérifiait seulement is_wp_error($is_valid) — null n'est pas une WP_Error, donc la vérification passe incorrectement.

Chemin d'exécution vers la prise de contrôle administrateur

  1. L'attaquant envoie l'en-tête X-BurstMainWP: 1 avec n'importe quelle requête
  2. has_admin_access() déclenche is_mainwp_authenticated()
  3. wp_authenticate_application_password() renvoie null (hors contexte API)
  4. is_wp_error(null) = false → la vérification passe
  5. wp_set_current_user($admin_id) s'exécute
  6. L'utilisateur courant est désormais l'administrateur choisi
  7. L'attaquant envoie une requête POST à /burst/v1/mainwp-auth
  8. handle_auth_request() génère un mot de passe d'application WordPress
  9. Le jeton est renvoyé sous forme base64(username:app_password)
  10. L'attaquant utilise ce jeton pour un accès administrateur persistant via l'API REST

Analyse du correctif (3.4.2)

// class-mainwp-proxy.php, lignes 399-415 (corrigé 3.4.2)
$allow_application_password_request = static function (): bool {
    return true;
};
add_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );
$authenticated_user = wp_authenticate_application_password( null, $parts[0], $parts[1] );
remove_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );

if ( ! $authenticated_user instanceof \WP_User ) {
    return false;
}
if ( ! hash_equals( (string) $authenticated_user->user_login, $parts[0] ) ) {
    return false;
}

Correctifs appliqués :

  • Forcer le filtre application_password_is_api_request à true pour que la validation réelle du mot de passe ait lieu
  • Vérifier que le résultat est une instance de WP_User (et non null)
  • Utiliser hash_equals() pour vérifier la correspondance du nom d'utilisateur

De plus, check_auth_permission() du point de terminaison REST a été renforcée pour exiger current_user_can('manage_burst_statistics') et une vérification explicite du nonce pour les requêtes authentifiées par cookie.

Preuve de concept

cURL manuel

Télécharger l’outil