加载中...
CVE-2020-24186复现
发表于:2022-04-05 | 分类: web
字数统计: 1.4k | 阅读时长: 5分钟 | 阅读量:

WordPress评论插件wpDiscuz任意文件上传漏洞

CVE-2020-24186

产品介绍

WordPress是一款能建立出色网站、博客或应用程序的开源软件。wpDiscuz是wordpress的一款创新,现代且功能丰富的评论插件,可充实使用wordpress所建立的网站评论部分。

漏洞简介

漏洞危害:

wpDiscuz插件存在高危漏洞,此漏洞允许未经验证的攻击者在目标站点上传任意文件,包括php文件,可以实现远程代码执行。

漏洞原因:

这个CVE主要是用户在目标站点进行评论时,可以进行上传图片文件进行评论,尝试文件上传后使用burpsuit抓包,可以向文件内容添加文件头如GIF89a,即刻上传成功。因为没有进行严格的过滤和文件名后缀的检测,中间过程有使用php的getimagesize函数来对上传文件进行判断执行,该函数返回结果中有文件大小和文件类型,如果用这个函数获取文件类型就会有问题,可以加上对应的图片文件头来伪造图片类型,因此即可上传php文件成功。

响应包中返回了文件上传后的路径,访问即可造成对应的命令执行漏洞。

综上,利用链为:在wpDiscuz模块上传php文件时使用burpsuit抓包,写入图片文件头,例GIF89a,在后面写入相应的webshell,上传后查看文件所在路径,访问即可达到远程命令执行。

影响产品:

wpDiscuz 7.0.0 – 7.0.4

补丁分析

升级wpDiscuz版本。

isAllowedFileType函数中对extension后缀进行了检测,当MIME与后缀不一样时会在进入最后一步之前返回False,也就是说使用MIME的白名单来对上传文件的后缀进行了限制。

漏洞调试环境搭建

Wordpress5.4.1下载地址:

https://cn.wordpress.org/wordpress-5.4.1-zh_CN.tar.gz

wpDiscuz7.0.4下载地址:

https://downloads.wordpress.org/plugin/wpdiscuz.7.0.4.zip

在本机的windows环境下搭建:

1、下载phpstudy启动相应的web服务,提前在mysql建立一个wordpress数据库。

2、将wordpress解压到www目录下。

3、将wpDiscuz解压到WWW\wordpress\wp-content\plugins目录下。

4、访问wordpress按照步骤搭建网站。

5、进入到wordpress后台开启wpDiscuz插件即可。

漏洞代码分析

【详细分析过程,需要给出关键代码片段或截图】

上传图片文件尝试burpsuit抓包,发现是向wordpress/wp-admin/admin-ajax.php发送请求

于是去分析admin-ajax.php,一开始没有查到什么,后面发现require了ajax-actions.php

开始分析ajax-actions.php,定位到上传模块,在wp_ajax_upload_atachment这个函数里面,可以发现对上传文件的类型进行了限制,

一个个追溯分析肯定有点麻烦,于是接下来追踪一些有用的函数开始打上断点,然后上传文件一点一点进行debug调试,进行详细的解析,一路debug,最终确定能够造成漏洞点大致的结构如下:

上传一个php后缀的文件并且加上文件头GIF89a,从产生漏洞的地方开始追踪,可以全局搜索查看哪里使用了@getimagesize函数,最终发现在wp_get_image_mime函数里面,这里就因为文件头的伪造使最终return的mime变成了image/gif。

继续追踪,返回到调用的函数,发现是先调用了isImage函数,再在里面调用了wp_get_image_mime函数。

在后续的检验中,持续绕过检测,成功上传文件

这里确定了mime类型后,由于是image/gif,就会向$attachmentIds写入对应的值

最终根据$attachmentIds校验,成功写入返回包的数据,写入成功。

最后查看返回包的内容确定上传文件的路径,访问即可执行对应的webshell。

武器化利用

有师傅已经写出来了,我就模仿着自己再写了一个,最终测试可以实现了上传webshell之后进行远程代码执行。

源码:https://github.com/Sakura-501/CVE-2020-24186-exploit

Exp使用方法:

Commands:

- Windows/Linux:

python3 CVE-2020-24186.py -u -p

Example:

python3 CVE-2020-24186.py -u http://127.0.0.1 -p /wordpress/2022/04/04/hello-world

总结

这个cve早有师傅分析完了,我先看了一遍师傅们的分析,然后自己去搭建环境分析一遍又是不一样的收获,自己debug一遍会对这一个漏洞点有着更深刻的发现。一开始我按照师傅们的分享的思路分析,发现并不是很正确,于是自己去慢慢看源代码才发现师傅们更细节的地方并没有讲清楚,所以导致一开始的我看的不是很懂。比如一开始我不知道为什么可以加上GIF89a文件头就能上传成功,师傅们的文章也没有详细写清楚。于是自己不断下断点,慢慢debug,最后发现是在php的一个原生函数getimagesize出现了问题,可以进行文件头伪造绕过。所以漏洞挖掘的复现需要亲自实现一遍才会明白更多细节。

第一次写exploit,照着师傅们的exp我自己写了一遍,基本了解了python是如何进行exp的编写,自己也学习到了很多新的东西,比如Python的optparse可以解析脚本输入的参数值等等。

参考资料

https://www.cnblogs.com/sukusec301/p/15813117.html

https://www.exploit-db.com/exploits/49962

https://blog.csdn.net/qq_40989258/article/details/108753535

https://github.com/h3v0x/CVE-2020-24186-WordPress-wpDiscuz-7.0.4-RCE

https://www.pythonf.cn/read/158357

上一篇:
Wordpress分析
下一篇:
PHPSTORM如何进行项目的debug
本文目录
本文目录