Yucaerin/CVE-2026-5118
GitHub: Yucaerin/CVE-2026-5118
针对 WordPress Divi Form Builder 插件未授权权限提升漏洞(CVE-2026-5118)的概念验证利用工具,支持单目标利用与多线程批量扫描。
Stars: 0 | Forks: 1
# CVE-2026-5118 — Divi Form Builder <= 5.1.2 — 通过 Role Injection 实现的未经身份验证的权限提升
🔥 **漏洞概述**
WordPress 插件 **Divi Form Builder** **<= 5.1.2** 版本存在一个**未经身份验证的权限提升**漏洞。这个严重缺陷允许**未经身份验证的攻击者**直接通过任何 Divi Form Builder 表单(包括联系表单、报价表单、简报纸表单或任何其他启用 DFB 的表单)创建新的**管理员**账号。
该漏洞源于 `FormSubmissionHandler.php` 中的 `create_user()` 函数,该函数直接接受用户提交的 POST 数据中的 `role` 参数,而没有进行适当的授权或白名单验证。该插件仅检查提交的 role 在系统中**是否存在**(例如,`administrator` 是一个有效的 WordPress role)——而从不检查该 role 对于公开注册是否**安全**。
**突破性发现:** Divi Form Builder 使用的 `fb_nonce` 是一个**全局共享的 nonce** (`wp_create_nonce('security')`) ——在网站上的所有表单中都是相同的。此外,`form_type=register` 可以**通过 POST 覆盖**到共享的 AJAX handler 中。这意味着任何 DFB 表单(联系、报价、反馈等)都可以被武器化,从而触发带有任意 role 分配的用户注册。
🔍 **受影响的插件**
- **插件名称:** Divi Form Builder
- **受影响版本:** <= 5.1.2
- **漏洞类型:** 通过 Role Injection 实现的未经身份验证的权限提升
- **CVE ID:** CVE-2026-5118
- **CVSS 评分:** 9.8(严重)
- **CWE:** CWE-266 — 权限分配不当
- **影响:** 完全接管网站 — 创建管理员账号
🧨 **攻击者可以做什么**
| 能力 | 影响 |
|---|---|
| 🔑 无需登录创建管理员账号 | **完全接管网站** |
| 📦 访问 WooCommerce 客户数据 | **数据泄露** |
| 💉 编辑插件/主题 PHP 文件 | **远程代码执行** |
| 🕳️ 安装隐藏的后门 | **持久化访问** |
| 👥 查看所有用户数据 | **隐私泄露** |
🧪 **利用特性**
- 🔓 **无需身份验证**
- 📝 **可通过任何 DFB 表单工作** — 联系、报价、简报、反馈等
- 🎯 **针对 AJAX endpoint** `/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handler`
- 🧠 **Role injection** — 在正常表单字段旁边提交 `role=administrator`
- 🌐 **支持批量扫描** — 具有自动发现功能的多线程多目标扫描器
- 📄 **结果保存至** `result.txt`
🧠 **存在漏洞的代码**
```
// includes/shared/handlers/FormSubmissionHandler.php ~ line 2250
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// ~ line 2278 — ONLY checks if role EXISTS, not if it is SAFE
$roles_obj = function_exists('wp_roles') ? wp_roles() : null;
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) && !isset($roles_obj->roles[$role])) {
$role = 'subscriber'; // ← "administrator" EXISTS, so this check PASSES
}
// ~ line 2301 — Directly applies the injected role
$user = new WP_User($user_id);
$user->set_role($role); // ← PRIVILEGE ESCALATION!
```
🚀 **用法**
### 单一目标
```
python3 exploit.py -t http://target.com
python3 exploit.py -t https://target.com -u hacker -p Pass123! -e hack@proton.me
```
### 批量扫描(不带 http/https 的列表)
创建 `targets.txt`:
```
target1.com
target2.com:8080
192.168.1.50
subdomain.target.com
```
```
python3 exploit.py -l targets.txt -T 20
```
### 选项
| 标志 | 描述 |
|---|---|
| `-t, --target` | 单一目标 URL |
| `-l, --list` | 包含目标列表的文件(每行一个,http/https 可选) |
| `-T, --threads` | 用于批量扫描的线程数(默认:10) |
| `-o, --output` | 输出结果的文件(默认:`result.txt`) |
| `-u, --username` | 新账号的自定义用户名 |
| `-p, --password` | 新账号的自定义密码 |
| `-e, --email` | 新账号的自定义电子邮件 |
| `-v, --verbose` | 详细的调试输出 |
| `--no-confirm` | 跳过权限确认提示 |
🛠 **修复建议**
```
// SECURE: Allowlist only safe roles for public registration
$allowed_registration_roles = array('subscriber', 'contributor');
if (!in_array($role, $allowed_registration_roles, true)) {
$role = 'subscriber'; // ← Reject ALL dangerous roles
}
```
- 完全移除前端表单中的 `role` 隐藏输入
- 为高权限 role 添加 `current_user_can('create_users')` 能力检查
- 实施严格的作用域为单个表单的 nonce 验证,而不是全局 nonce
- 在注册 AJAX endpoint 上添加速率限制
🧠 **研究员**
- 鸣谢:[0xd4rk5id3](https://www.wordfence.com/threat-intel/vulnerabilities/researchers/0xd4rk5id3)
📚 **参考**
- [Wordfence 公告](https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/divi-form-builder/divi-form-builder-512-unauthenticated-privilege-escalation-via-role)
- [原始 CVE 仓库](https://github.com/zycoder0day/CVE-2026-5118)
🔒 **免责声明:**
此信息仅供**教育**和**授权的渗透测试**目的使用。未经授权利用计算机系统是非法且不道德的。在测试您不拥有的任何目标之前,请务必获得明确的书面许可。
标签:Web安全, WordPress插件, 协议分析, 威胁模拟, 文件完整性监控, 无服务器架构, 权限提升, 漏洞披露, 蓝队分析, 逆向工具