Drag and Drop Multiple File Upload for Contact Form 7 安全通知
如果您收到我的邮件并被引导到此页面,是因为您的网站看起来正在运行的 Drag and Drop Multiple File Upload for Contact Form 7 版本(这是 WordPress.org 上以该名称列出的插件,作者为 codedropz,在您的文件中位于
/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/)落在某个已知安全问题的受影响范围内。本页说明该问题是什么、如何判断它是否适用于您的网站、如何在不被误导的情况下查看您的版本,以及如何更新。
请注意:这不是 WooCommerce 版本。 同一位作者还发布了另一个独立插件“Drag and Drop Multiple File Upload for WooCommerce”(目录为
drag-and-drop-multiple-file-upload-for-woocommerce),它是一个拥有自己版本号体系的不同产品。如果您文件中的插件是 WooCommerce 版而不是 Contact Form 7 版,本页与它无关。以下内容仅涉及 Contact Form 7 附加插件。
在其他一切之前,关于本通知最重要的事实是:处于受影响范围内的版本本身并不意味着您的网站已被暴露。 下文所述问题只有在网站拥有某种特定类型的上传字段时才会发生作用,而我无法从外部看到您的表单是如何配置的:
- 该问题只会触及某个 Contact Form 7 表单中被设置为接受任意文件类型的、该插件的拖放上传字段。
- 将接受类型限制为特定类型(例如图片或 PDF)的字段,即使在受影响版本上,也不会暴露于该问题。当字段未指定接受类型时,限制接受类型也是默认设置。
我可以从一个公开文件中读取您的插件版本,但无法读取您的表单配置,因此本通知是一次预防性提醒,而不是对您网站的确认性发现。
该问题是 CVE-2026-18781,是该插件上传处理流程中一个未经身份验证的文件上传缺陷。它影响 1.3.9.3 至 1.3.9.8 版本,并在 1.3.9.9 中得到修复。如果您运行的是受影响版本,请将 Drag and Drop Multiple File Upload for Contact Form 7 更新到 1.3.9.9 或更高版本,并同时保持 Contact Form 7 本身为最新版本。
关于紧迫性,说明一点:这是一个有条件的通知。如果您的所有上传字段都不接受任意文件类型,更新只是一次普通的插件维护。如果其中有一个字段接受任意文件类型,请将更新视为优先事项:在这种配置下,该缺陷可能让一个完全没有账号的访问者,把自己选择的文件保存到您的服务器上,而服务器随后可能会运行这种文件,从而导致网站被完全控制。
这是一个插件缺陷,不是 WordPress 核心的缺陷,也与 Contact Form 7 本身无关。如果这个附加插件处于受影响版本,一个完全更新的 WordPress 以及一个最新版本的 Contact Form 7 都不能保护您。
这封邮件是真实的吗?
是的。这是一位独立安全研究者出于善意、依照负责任披露原则发出的通知。我不会向您索取金钱、密码或网站访问权限,我也没有尝试入侵您的网站、提交您的任何表单,或向其上传任何内容。
我所做的只是查看您的网站向每位访问者公开提供的文件(就像您的首页是公开的一样),并记录该插件公开的版本号。我特意没有提交任何表单、没有上传任何文件,也没有靠近该插件的上传处理程序。这次检查的任何环节都不会触及您的数据、您的后台,或您网站的任何私有部分(详见下方 我做了什么、没做什么)。
如果您想核实我的身份,请查看本页底部的联系方式以及关于页面。
为什么这很重要
该插件为 Contact Form 7 表单添加了拖放式文件上传字段,使访问者在提交表单时可以附带文件:一份求职申请、一个支持请求、一张照片。为了保证这一过程的安全,该插件本应拒绝危险的文件类型。
在受影响的版本中,这项检查是可以被绕过的。该插件会检查已上传文件的名称,以判断其类型是否被允许,然后再调整该名称,并在不重新检查调整后名称的情况下保存文件。由于名称是在通过检查之后才被更改的,攻击者可以精心构造一个文件名,使被检查的那个版本看起来无害,而实际被保存的那个版本却并非如此,从而让一个不被允许的文件类型落到服务器上。如果服务器随后把这个文件当作可以运行的东西来对待,结果就是一个陌生人的文件在您的网站上运行。
由此可以得出两点,它们的方向正好相反。第一点是,只有当某个表单拥有一个被配置为接受任意文件类型的上传字段时,这才会构成问题。如果每一个上传字段都被限制为一组特定类型,伪装过的文件就不会匹配任何允许的类型而被拒绝,处于这种状态的网站无法通过这个问题被触及。第二点是,只要存在一个“接受任意类型”的字段,就不需要任何账号、任何密码,也不需要任何人的配合:表单本来就是设计为向公众开放的。
我只讲到网站所有者采取行动所需的详细程度,不再深入。我不会公布那些足以让人复现该问题的细节,也请您不要在自己的或他人的网站上尝试。像下文所述那样,查看您的表单配置和版本号,就足以让您决定该做什么。
如果我的邮件引用了这个问题,说明您网站报告的版本落在受影响范围内。我并没有测试您这个具体网站是否可被利用,也无法看到您的表单是如何配置的。我观察到的只有版本号。
我受影响吗?
这取决于两个问题,按以下顺序判断。
第一步:是否有任何上传字段接受“任意文件类型”?
这是决定性的问题,只有您能回答它。检查您自己的表单是完全安全的,这正是本页存在的意义。
- 登录您的 WordPress 仪表盘,打开侧边栏中的联系(Contact Form 7)菜单。
- 打开每一个提供文件上传功能的表单,找到拖放上传字段(这是该插件添加的字段,与标准 Contact Form 7 标签并列显示)。
- 查看该字段是否限制了它所接受的文件类型。
- 如果每一个上传字段都被限制为特定类型(例如
jpg、png、pdf),即使在受影响版本上,这个问题也不会触及您的网站。作为常规维护,更新仍然值得进行。 - 如果有任何上传字段被设置为接受任意文件类型,这个问题就适用于您,您应当尽快更新。将该字段限制为您实际需要的类型本身也是明智的一步,但真正的修复是更新。
请不要尝试在自己的或他人的网站上复现这个问题;您不需要这样做就能回答上面的问题。
第二步:您运行的是哪个版本?
您不必只听我一面之词。对于这个插件,有一种特定的检查方式会误导您,因此值得仔细阅读这一部分。
从 WordPress 后台查看(权威来源):
- 在您的 WordPress 仪表盘中,进入插件,然后是已安装的插件。
- 找到 Drag and Drop Multiple File Upload - Contact Form 7,也就是目录为
drag-and-drop-multiple-file-upload-contact-form-7的那一项,查看其名称下方显示的版本。
从公开清单文件查看(无需登录): 在浏览器中打开
yourdomain.com/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/readme.txt。靠近开头的 Stable tag: 一行就是您的安装所报告的版本,这也是我所读取的公开来源之一。
从页面源代码查看(无需登录): 查看您网站某个页面的源代码,寻找该插件的某个前端资源文件,其路径必须完全是以下之一:
/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/assets/css/dnd-upload-cf7.css?ver=...
/wp-content/plugins/drag-and-drop-multiple-file-upload-contact-form-7/assets/js/codedropz-uploader-min.js?ver=...
附加在该目录下这些文件上的 ?ver= 数字就是该插件自身的版本。对这个插件而言,它与发布版本完全一致,这也是我将其视为可靠读数的原因。
这里有一个需要避开的陷阱。 作者的另一个 WooCommerce 插件在它自己的目录(drag-and-drop-multiple-file-upload-for-woocommerce)下也带有一个同名文件 codedropz-uploader-min.js,但其版本号与本插件毫不相关。如果您从页面源代码中读取版本号,请确认路径中的目录是
drag-and-drop-multiple-file-upload-contact-form-7,而不是 WooCommerce 那个目录;否则您读到的将完全是另一个产品的版本。
然后套用以下规则,注意版本号是按数字而不是按字母顺序比较的:
- 1.3.9.3 至 1.3.9.8: 可能受影响,取决于上文所述的上传字段问题。请立即更新。
- 1.3.9.9 或更新版本: 就本问题而言已经修复。使用最新可用版本是最佳选择。
- 早于 1.3.9.3: 不受本问题影响。上文所述的这个具体缺陷是从 1.3.9.3 开始引入的。话虽如此,这么旧的发布版本在其他方面早已远远落后,从总体上讲更新仍然值得进行。
如果您无法从上述检查中得到可读的版本号,这并不罕见:缓存或优化类插件经常会去掉 ?ver= 的值,而且这些资源文件只会出现在插件实际加载的页面上。第一步中的后台界面总能给出答案。
如何升级
最稳妥的做法是通过 WordPress 自身更新,并且先做备份:
- 在做出更改之前,先备份您的网站(文件和数据库)。多数主机商提供一键备份,或者使用一款 WordPress 备份插件。
- 在 WordPress 后台,进入仪表盘然后更新,或者插件然后已安装的插件。如果列出了这个插件的更新,请从这里安装。
- 如果您更习惯命令行,WP-CLI 的效果相同:
wp plugin update drag-and-drop-multiple-file-upload-contact-form-7(该命令使用的是目录名)。 - 如果没有出现更新,您可以直接从该插件在 WordPress.org 目录中的页面 Drag and Drop Multiple File Upload for Contact Form 7, 获取最新发布版本,并通过插件然后安装插件然后上传插件进行更新。
- 更新后,请用上面的步骤确认新的版本号(1.3.9.9 或更高),并检查您的表单和文件上传功能是否仍能正常工作。
趁着在后台,也值得确认一下 WordPress 核心、Contact Form 7 以及您的其他插件是否都是最新的,因为同样的道理适用于它们全部。
更新之后
更新到 1.3.9.9 或更高版本即可关闭这个问题,对多数网站来说,这就是全部要做的事。本页是一份预防性通知,而不是事件报告:我对您的网站上是否发生过什么没有任何可见性,我也没有去查看。
有一项后续工作值得考虑,它同样取决于那个上传字段的问题。如果您的网站在运行受影响版本期间,某个表单存在一个“接受任意文件类型”的上传字段,那么从理论上讲,至少存在文件被放置到您服务器上的可能性。更新可以关闭这个漏洞,但不会移除任何可能已经被保存下来的东西,因此在这种情况下,采取一些常规的预防措施是明智的:
- 查看您的上传目录(通常位于
wp-content/uploads/下),寻找您不认识的文件,尤其是那些不属于您的表单原本应当接收的文档或图片类型的文件。 - 检查您的管理员账号、最近的登录记录以及任何活动会话,留意任何您无法解释的情况。
- 重置您管理员账号的密码。 重新生成
wp-config.php中 WordPress 的安全密钥与 salt 也是一个明智的配套步骤(新值可在官方 密钥生成器一键获取,替换它们会让所有用户登出一次)。
如果您发现了令您担忧的情况,把它当作任何其他可疑的未经授权访问来处理,是正确的应对方式。如果您的表单都没有“接受任意文件类型”的上传字段,那么只需更新即可。
我做了什么、没做什么
为了完全说明我这封邮件背后的检查过程:我只读取了您的网站本来就向每位访问者提供的文件,具体是该插件的公开 readme.txt、您的首页,以及写入该页面中的资源地址。我没有访问您的 WordPress 后台、数据库,或网站的任何私有部分。
特别地,我从未提交过您的任何表单,从未上传过文件,也从未触碰过该插件的上传处理程序。没有任何东西被提交、测试或利用。这一点在本页比在大多数同类页面上更重要,因为上传文件正是这个问题所涉及的确切动作,所以“我没有碰它”就是披露与入侵之间的全部区别。
我也有意不公布那些能帮助他人利用这个问题的细节。上面的描述止步于网站所有者所需的程度,我也不会链接任何概念验证代码。
这是一项基于版本的观察:您的网站报告的版本处于受影响范围内。这并不是在说您的网站在我检查时是可被利用的。由于该问题取决于一个我无法看到的表单设置,处于该范围内的网站很可能根本没有被暴露,处于该范围内的网站也可能另外通过其他方式得到保护,例如 Web 应用防火墙。
我没有网站管理员 / 我卡住了
如果维护网站的不是您本人,请将本页转发给负责的人(您的开发人员、代理机构或主机商)。他们会很快认出上述步骤。
如果您自己维护网站并遇到困难,我很乐意免费为您指明方向。请通过下方联系方式与我联系。
联系方式
Evan Harris,安全研究员
- 邮箱:security@mail.mcpsec.dev
- X:@Evan__Harris
- GitHub:eharris128
- LinkedIn:Evan Harris
我就此类问题主动联系,纯粹是为了帮助运营者保护自己的网站。如果您不希望再次收到联系,请告诉我,我会遵从。
参考
官方公告与追踪
开发者 / 插件