漏洞概述
众所周知,Contact Form 7是一款非常受欢迎的WordPress插件。但是根据安全研究专家的最新发现,Contact Form 7中存在一个不受限制的文件上传漏洞。这个漏洞被标记为了高危漏洞,目前存在漏洞的Contact Form 7插件已经安装在了500多万个网站上,使得这些网站将成为攻击者严重的“香饽饽”。在该漏洞的帮助下,攻击者将能够对目标站点执行网络钓鱼、网站接管、数据窃取和Credit卡欺诈等攻击活动。
在这篇文章中,我们将介绍并分析该漏洞的成因,并给出针对该漏洞的概念验证PoC以及缓解方案。
Contact Form 7插件
关于该插件的信息,我们直接引用该插件官方文档给出的介绍:
Contact Form 7是一款免费的wordpress联系表单插件,简称CF7,在WP官方的插件排行榜里排名第一,也是表单插件里最受欢迎的插件之一。该插件可以管理多个联系人表单,并且可以通过简单的标记灵活地定制表单和邮件内容。
漏洞介绍
国家漏洞数据库(NVD)目前已将该漏洞标记为了CVE-2020-35489,相关漏洞描述如下:
- WordPress的Contact Form 7插件(版本低于v5.3.2)将允许攻击者实现不受限制的文件上传和远程代码执行(由于文件名中可能包含特殊字符)。
- 该插件允许WP管理员在自己的网站上创建联系人表单,网站用户可以在表单中输入相关联系信息以获取技术支持或获取反馈信息。
- 恶意用户可以通过上传一个文件名中包含了双扩展名的文件来利用该漏洞,文件名由不可打印或特殊字符分隔,比如“说php .jpg”(\t字符是分隔符)。
接下来,Contact Form 7并不会从上传文件的文件名中移除这些字符,并且会解析包含第一个扩展名在内的之前的文件名,而分隔符会导致Contact Form 7无法解析后续的扩展名。因此,最后的文件名就变成了“php”。
而攻击者将能够通过远程代码执行在服务器中访问或执行此文件。
关于Contact Form 7的源代码,感兴趣的同学可以点击【这里】查看托管在GitHub上的源代码。
因此,攻击者将能够利用漏洞CVE-2020–35498对目标站点产生严重的安全影响。
漏洞利用PoC
注意,我们还不能公开披露该漏洞的相关技术和利用细节,因为官方的PoC尚未发布。而且在2020年12月31日之前,我们还要给供应商和广大用户一定的时间来进行更新。
在这里,我将在本地配置一个WordPress站点,并演示如何利用该漏洞。我将使用Contact Form 7 v5.3.1版本的插件来演示该漏洞的利用方法,因为这个漏洞已在2020年12月17日发布的5.3.2版本中进行了修复。
环境配置
首先,我们需要下载、导入、安装并激活该插件:
此时,Contact Form 7插件已经安装并激活陈公公了。
第二步,我们要在WordPress侧边栏中找到“Contact”标签,然后点击“Add New”按钮来创建一个新的表单。
接下来,为了进行漏洞演示,我创建了一个“Job Application Form”表单,这个表单提供了一个文件上传的功能支持。
最后,将这个表单添加至一个页面中并发布。
攻击场景
我们访问这个新建的页面,然后在表单中文件上传部分上传一个文件名为“exploit.php .jpg”的文件。
我们的恶意文件此时将会被成功上传至服务器。
点击“Submit”按钮,我们将会收到服务器端返回的上传响应,表明我们的文件已经成功上传了,文件名为“exploit.php”。接下来,我们将能够通过任意代码执行在服务器中访问或执行此文件了。
文件的默认上传路径为“wp-content/uploads”,但是可以通过下列方式来修改文件上传路径(WPCF7_UPLOADS_TMP_DIR):
- define( 'WPCF7_UPLOADS_TMP_DIR', '/your/file/path' );
漏洞影响
通过利用该漏洞,攻击者可以直接上传任意类型的文件,并绕过目标站点部署的上传文件类型限制,其后果可能但不限于:
- 接管整个网站;
- 恶意软件感染,窃取Credit卡信息,将用户重定向至恶意页面;
- 网络钓鱼攻击;
- 获取目标服务器文件系统和数据库信息;
- 插入后门程序;
- ......
漏洞缓解
进入WordPress插件功能页面中,将该插件版本更新至v5.3.2或更新版本。除此之外,我们还可以使用WordPress安全漏洞扫描器-WPSec来扫描和监控我们的WordPress站点。运行WPSec之后,我们将看到如下图所示的输出内容:
实际上,类似的漏洞经常都会常出现。因此我们建议广大用户尽量定期手动对插件进行更新。除此之外,我们还应该禁止uploads文件夹内的PHP代码执行功能。如果使用的是Nginx,可以在配置文件中添加下列内容来禁用PHP代码执行功能:
- location ^~ /wp-content/uploads/ {
- }
对于Apache Web服务器,我们不建议通过在uploads文件夹中放置.htaccess文件来防止PHP代码执行,因为攻击者很可能会使用上述漏洞覆盖此文件。我们可以使用Apache配置文件来阻止执行,但这在共享宿主环境中可能是一个问题。同时,我们可以将AllowOverride设置为None以防止.htaccess文件覆盖设置。