本文共 791 字,预计阅读时间 4 分钟
首发于 『先知社区』
在T00ls上看到一个老哥WordPress站点被搞了,下载了Access日志分析了一下,发现攻击路径是先访问了一个页面,然后访问 /wp-admin/admin-ajax.php?action=wmuUploadFiles 后直接就Shell落地了,确定是这个模块有问题了,后来说是wpDiscuz评论插件的漏洞,看了下官网V7.0.5修复了一次安全漏洞,于是下载了一个低版本测试一下。
官方版本更新信息
漏洞分析
完成WordPress环境搭建后,手动安装wpDiscuz插件,看到文章下增加了评论模块。
环境搭建
PHPStorm导入Web目录,点击图片按钮,上传一个PHP文件测试一下,默认是上传不了的。
尝试直接上传
从入口点分析,原来是 wp_filter 处进行了过滤。
跟踪过滤函数
跟进去,可以看到上传的功能点,再进去。
分析上传功能函数
可以看到使用了 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。
连接Webshell
漏洞检测
在装上wpDiscuz插件后,每篇文章中都会带有特定的标签信息,且带有版本号,可利用此特征编写脚本或者御风插件进行检测。
插件指纹信息
喜欢您来,喜欢您再来