CVE-2020-35489:Contact Form 7插件中的不受限制文件上傳漏洞
漏洞概述
眾所周知,Contact Form 7是一款非常受歡迎的WordPress插件。但是根據(jù)安全研究專家的最新發(fā)現(xiàn),Contact Form 7中存在一個不受限制的文件上傳漏洞。這個漏洞被標(biāo)記為了高危漏洞,目前存在漏洞的Contact Form 7插件已經(jīng)安裝在了500多萬個網(wǎng)站上,使得這些網(wǎng)站將成為攻擊者嚴(yán)重的“香餑餑”。在該漏洞的幫助下,攻擊者將能夠?qū)δ繕?biāo)站點(diǎn)執(zhí)行網(wǎng)絡(luò)釣魚、網(wǎng)站接管、數(shù)據(jù)竊取和Credit卡欺詐等攻擊活動。
在這篇文章中,我們將介紹并分析該漏洞的成因,并給出針對該漏洞的概念驗證PoC以及緩解方案。
Contact Form 7插件
關(guān)于該插件的信息,我們直接引用該插件官方文檔給出的介紹:
Contact Form 7是一款免費(fèi)的wordpress聯(lián)系表單插件,簡稱CF7,在WP官方的插件排行榜里排名第一,也是表單插件里最受歡迎的插件之一。該插件可以管理多個聯(lián)系人表單,并且可以通過簡單的標(biāo)記靈活地定制表單和郵件內(nèi)容。
漏洞介紹
國家漏洞數(shù)據(jù)庫(NVD)目前已將該漏洞標(biāo)記為了CVE-2020-35489,相關(guān)漏洞描述如下:
- WordPress的Contact Form 7插件(版本低于v5.3.2)將允許攻擊者實(shí)現(xiàn)不受限制的文件上傳和遠(yuǎn)程代碼執(zhí)行(由于文件名中可能包含特殊字符)。
- 該插件允許WP管理員在自己的網(wǎng)站上創(chuàng)建聯(lián)系人表單,網(wǎng)站用戶可以在表單中輸入相關(guān)聯(lián)系信息以獲取技術(shù)支持或獲取反饋信息。
- 惡意用戶可以通過上傳一個文件名中包含了雙擴(kuò)展名的文件來利用該漏洞,文件名由不可打印或特殊字符分隔,比如“說php .jpg”(\t字符是分隔符)。
接下來,Contact Form 7并不會從上傳文件的文件名中移除這些字符,并且會解析包含第一個擴(kuò)展名在內(nèi)的之前的文件名,而分隔符會導(dǎo)致Contact Form 7無法解析后續(xù)的擴(kuò)展名。因此,最后的文件名就變成了“php”。

而攻擊者將能夠通過遠(yuǎn)程代碼執(zhí)行在服務(wù)器中訪問或執(zhí)行此文件。
關(guān)于Contact Form 7的源代碼,感興趣的同學(xué)可以點(diǎn)擊【這里】查看托管在GitHub上的源代碼。
因此,攻擊者將能夠利用漏洞CVE-2020–35498對目標(biāo)站點(diǎn)產(chǎn)生嚴(yán)重的安全影響。
漏洞利用PoC
注意,我們還不能公開披露該漏洞的相關(guān)技術(shù)和利用細(xì)節(jié),因為官方的PoC尚未發(fā)布。而且在2020年12月31日之前,我們還要給供應(yīng)商和廣大用戶一定的時間來進(jìn)行更新。
在這里,我將在本地配置一個WordPress站點(diǎn),并演示如何利用該漏洞。我將使用Contact Form 7 v5.3.1版本的插件來演示該漏洞的利用方法,因為這個漏洞已在2020年12月17日發(fā)布的5.3.2版本中進(jìn)行了修復(fù)。
環(huán)境配置
首先,我們需要下載、導(dǎo)入、安裝并激活該插件:

此時,Contact Form 7插件已經(jīng)安裝并激活陳公公了。
第二步,我們要在WordPress側(cè)邊欄中找到“Contact”標(biāo)簽,然后點(diǎn)擊“Add New”按鈕來創(chuàng)建一個新的表單。
接下來,為了進(jìn)行漏洞演示,我創(chuàng)建了一個“Job Application Form”表單,這個表單提供了一個文件上傳的功能支持。
最后,將這個表單添加至一個頁面中并發(fā)布。
攻擊場景
我們訪問這個新建的頁面,然后在表單中文件上傳部分上傳一個文件名為“exploit.php .jpg”的文件。

我們的惡意文件此時將會被成功上傳至服務(wù)器。
點(diǎn)擊“Submit”按鈕,我們將會收到服務(wù)器端返回的上傳響應(yīng),表明我們的文件已經(jīng)成功上傳了,文件名為“exploit.php”。接下來,我們將能夠通過任意代碼執(zhí)行在服務(wù)器中訪問或執(zhí)行此文件了。
文件的默認(rèn)上傳路徑為“wp-content/uploads”,但是可以通過下列方式來修改文件上傳路徑(WPCF7_UPLOADS_TMP_DIR):
- define( 'WPCF7_UPLOADS_TMP_DIR', '/your/file/path' );
漏洞影響
通過利用該漏洞,攻擊者可以直接上傳任意類型的文件,并繞過目標(biāo)站點(diǎn)部署的上傳文件類型限制,其后果可能但不限于:
- 接管整個網(wǎng)站;
- 惡意軟件感染,竊取Credit卡信息,將用戶重定向至惡意頁面;
- 網(wǎng)絡(luò)釣魚攻擊;
- 獲取目標(biāo)服務(wù)器文件系統(tǒng)和數(shù)據(jù)庫信息;
- 插入后門程序;
- ......
漏洞緩解
進(jìn)入WordPress插件功能頁面中,將該插件版本更新至v5.3.2或更新版本。除此之外,我們還可以使用WordPress安全漏洞掃描器-WPSec來掃描和監(jiān)控我們的WordPress站點(diǎn)。運(yùn)行WPSec之后,我們將看到如下圖所示的輸出內(nèi)容:

實(shí)際上,類似的漏洞經(jīng)常都會常出現(xiàn)。因此我們建議廣大用戶盡量定期手動對插件進(jìn)行更新。除此之外,我們還應(yīng)該禁止uploads文件夾內(nèi)的PHP代碼執(zhí)行功能。如果使用的是Nginx,可以在配置文件中添加下列內(nèi)容來禁用PHP代碼執(zhí)行功能:
- location ^~ /wp-content/uploads/ {
- }
對于Apache Web服務(wù)器,我們不建議通過在uploads文件夾中放置.htaccess文件來防止PHP代碼執(zhí)行,因為攻擊者很可能會使用上述漏洞覆蓋此文件。我們可以使用Apache配置文件來阻止執(zhí)行,但這在共享宿主環(huán)境中可能是一個問題。同時,我們可以將AllowOverride設(shè)置為None以防止.htaccess文件覆蓋設(shè)置。