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