wordpress评论插件wpDiscuz任意文件上传漏洞分析
前言
在t00ls上看到某wordpress站点被上传webshell,下载了access日志分析了一下,判断攻击路径:访问了某页面后 -> 访问了/wp-admin/admin-ajax.php?action=wmuUploadFiles接口 -> 访问webshell,因此确定是这个模块有问题;官网显示V7.0.5修复了一次安全漏洞,于是下载V7.0.3版本学习一下(7.0.4没找到)。
环境
- php 5.6.40
- mysql 5.7.26
- Phpstorm
- Wordpress 5.4.1 + wpdiscuz V 7.0.3
分析
- 环境搭建后,手动安装wpdiscuz插件后,看到文章下增加评论模块
- phpstorm导入web目录,点击图片按钮,上传一个php文件测试一下,上传路径是http://127.0.0.1:8888/wordpress/wp-admin/admin-ajax.php,默认是上传不了的。
- 从入口点分析,如图是wp_filter的action过滤
- 跟进去,可以看到上传的功能点,再进去
- 可以看到如图位置,使用getMimeType方法根据文件内容获取文件类型,并不是通过文件后缀名判断,进一步根据$mineType判断是否是允许的上传类型。
- 跟入查看isAllowedFileType方法,在判斷$mineType是否在$this -> options -> content[“wmuMimeTypes”]中存在。
- 如图,进入$options中,可以content[“wmuMimeTypes”]使用三目运算判断,搜索上下文得知,结果就是$defaultOptions[self::TAB_CONTENT][“wmuMimeTypes”]
- 进入$defaultOptions中可以得到最终$this -> options -> content[“wmuMimeTypes”]的值是几种常见的图片类型。
- 很明显此时文件类型已经通过getMimeType()方法修改为text/plain了,但是回到进入isAllowedFileType的代码,发现程序只在此处对上传文件进行了判断后,直接保存了文件。
利用
如此,程序只是根据文件内容判断文件类型,并未对文件后缀进行效验,构造一个图片马,或者手动在webshell前面加上图片头信息即可绕过。
- 把后门文件追加到图片后
- 上传并修改后缀名为php,可以看到返回路径
- 连接webshell
检测
在装上wpdiscuz插件后,每个文章中都会带有如下标签信息,且带有版本号,可利用此特征编写脚本。
check version demo
1 | import requests |