CVE-2026-114432:Contact Form 7 未认证任意文件上传,千万 WordPress 站点可被拿 shell

WordPress 装机量最大的表单插件 Contact Form 7 被披露一个未认证任意文件上传漏洞,编号 CVE-2026-114432,CVSS 3.1 评分 9.8。受影响版本为 6.2 至 6.2.3,攻击者不需要任何账号,只要站点装了带文件上传字段的表单,就能把任意文件写进 wp-content/uploads 目录。在 Debian 与 Ubuntu 的出厂 Apache 配置下,落盘的文件可以被直接定位并执行,形成远程代码执行。

事件概述

该漏洞由研究者 Shinya Murakami 报送,WPScan 漏洞库于 2026 年 11 月 5 日公开,CVE 记录在 11 月 8 日完成建档,分配方为 WPScan。插件作者已在 6.2.4 中修复,该版本发布于 10 月 29 日,当前最新版为 6.2.4.1。也就是说,修复版本比漏洞公开早了七天,但 WordPress 插件默认不会自动升级,绝大多数站点仍停在旧版本上。

Contact Form 7 在 WordPress.org 上的活跃安装量标注为 1000 万以上,是建站行业事实上的标配组件。它的表单接口对全网开放,不需要登录即可提交,因此这个漏洞的暴露面等同于「所有装了该插件的站点首页」。

技术细节:两个缺陷叠成一个洞

WPScan 给出的标题点明了成因:Invalid UTF-8 Filename。漏洞由两处独立缺陷叠加而成。

  • 上传字段不校验类型与扩展名:表单 file 字段接收的文件没有做 MIME 与后缀的白名单校验,任意内容都能进入处理流程。
  • 临时文件清理逻辑失效:当上传文件名包含非法 UTF-8 字节时,插件原有的临时文件清理步骤执行失败,文件没有被删除,而是留在了 uploads 目录里。

两者组合的结果是「未认证可写任意文件」。真实危害取决于 Web 服务器配置,官方描述给出了两种结局:

  • Debian/Ubuntu 出厂 Apache:默认开启目录列表,且把 .phar 映射到 PHP 处理器。攻击者先列出 uploads 目录找到随机文件名,再请求该 .phar,代码即被执行。
  • nginx,或启用了 .htaccess 覆盖的 Apache:降级为「任意文件写入 uploads 目录」,不能直接执行,但写入的 HTML、SVG 会以站点自身域名提供,可被当作钓鱼页面、存储型 XSS 载体,或绕过 CSP 的脚本宿主。

影响评估

CVSS 3.1 向量为 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H,未认证、无需交互、无需特殊条件,机密性与完整性影响均为高。EPSS 给出的 30 天利用概率约 0.22%(第 12 百分位),数值偏低是刚公开、样本尚未积累所致,不能当作风险很低的证据。截至发稿,该漏洞未进入 CISA KEV,也没有公开的利用代码。

对国内站点需要额外说明一点:nginx + PHP-FPM 的组合通常只把 .php$ 交给 FastCGI,uploads 目录下的 .phar 不会被解析,风险主要落在「任意文件落盘」这一层。但如果 fastcgi 正则被放宽到 \.(php|phtml|phar)$,或者站点跑在默认 Apache 上,就等于把 RCE 的门槛交了出去。这类配置在宝塔面板手工改过伪静态规则的机器上并不罕见,值得逐个核对。

修复建议

  • 升级到 6.2.4.1 或更高版本,这是唯一彻底的解法。后台「插件」页面可直接更新,多站点网络需要按网络启用更新。
  • 在 nginx 的 server 段加入 uploads 目录禁止执行脚本的规则,阻断 .phar、.phtml 这类后缀:
location ~* ^/wp-content/uploads/.*\.(php|php[0-9]|phtml|phar)$ {
    deny all;
}
location /wp-content/uploads/ {
    autoindex off;
}
  • 检查 Apache 是否开启了 Indexes 与 .phar 处理器映射,关闭目录列表,并从 PHP 处理器映射中移除 .phar。
  • 排查历史入侵:列出 uploads 目录下扩展名异常的文件、文件名含非法 UTF-8 字节的文件,以及近期的 .phar、.html、.svg 写入记录。
  • 日志侧检索 POST /wp-json/contact-form-7/v1/contact-forms/ 下 /feedback 端点的高频 multipart 上传,重点关注同一 IP 反复提交且响应体异常的记录。
  • WAF 侧对上传字段追加扩展名黑名单(php、phtml、phar、php5 等),并拦截 multipart 文件名中的非法编码字节。

如果站点数量多、不方便逐个翻目录,可以直接在服务器上按特征扫一遍,重点看 uploads 下不该出现的可执行后缀与被重命名的活动内容:

find /www/wwwroot/*/wp-content/uploads -type f \
  \( -iname "*.phar" -o -iname "*.php*" -o -iname "*.phtml" -o -iname "*.svg" \) \
  -newermt "2026-10-01" -printf "%TY-%Tm-%Td %p\n" | sort

为什么表单插件总出事

把这条漏洞放回近两年的 WordPress 生态看,它并不孤立。表单插件是所有插件里权限模型最尴尬的一类:必须对未认证访客开放写操作,必须处理用户提交的文件,还要把结果落盘或转发邮件,任何一环默认值设错都会直接变成公网可利用的写入点。Contact Form 7 过去几年出现过文件上传、反序列化、邮件头注入等多类问题,根源都在这个结构上。

对站长的现实建议是两层:一层是「最小化」,不需要文件上传字段的表单就不要保留这个字段,改了字段等于把入口关掉;另一层是「兜底」,无论插件怎么写,uploads 目录都不应该能执行脚本,这条规则应该写进所有站点的基线配置,而不是等下一次漏洞再补。

参考来源