众所周知,Contact Form 7是一款非常受欢迎的WordPress插件。但是根据安全研究专家的最新发现,Contact Form 7中存在一个不受限制的文件上传漏洞。这个漏洞被标记为了高危漏洞,目前存在漏洞的Contact Form 7插件已经安装在了500多万个网站上,使得这些网站将成为攻击者严重的“香饽饽”。在该漏洞的帮助下,攻击者将能够对目标站点执行网络钓鱼、网站接管、数据窃取和Credit卡欺诈等攻击活动。
在这篇文章中,我们将介绍并分析该漏洞的成因,并给出针对该漏洞的概念验证PoC以及缓解方案。
关于该插件的信息,我们直接引用该插件官方文档给出的介绍:
Contact Form 7是一款免费的wordpress联系表单插件,简称CF7,在WP官方的插件排行榜里排名第一,也是表单插件里最受欢迎的插件之一。该插件可以管理多个联系人表单,并且可以通过简单的标记灵活地定制表单和邮件内容。
国家漏洞数据库(NVD)目前已将该漏洞标记为了CVE-2020-35489,相关漏洞描述如下:
WordPress的Contact Form 7插件(版本低于v5.3.2)将允许攻击者实现不受限制的文件上传和远程代码执行(由于文件名中可能包含特殊字符)。
关于Contact Form 7的源代码,感兴趣的同学可以点击【这里】查看托管在GitHub上的源代码。
因此,攻击者将能够利用漏洞CVE-2020–35498对目标站点产生严重的安全影响。
注意,我们还不能公开披露该漏洞的相关技术和利用细节,因为官方的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' );
通过利用该漏洞,攻击者可以直接上传任意类型的文件,并绕过目标站点部署的上传文件类型限制,其后果可能但不限于:
进入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文件覆盖设置。