当前位置: 首页 > 科技观察

CVE-2020-35489:ContactForm7插件中文件上传不受限漏洞

时间:2023-03-15 14:45:29 科技观察

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