某报表v8.0 Getshell漏洞分析
2019-07-17 10:02:00 Author: xz.aliyun.com(查看原文) 阅读量:153 收藏

南京帆软软件有限公司(以下简称“帆软”)成立于2006年,是中国专业的大数据BI和分析平台提供商,专注商业智能和数据分析领域,致力于为全球企业提供一站式商业智能解决方案。帆软在专业水准、组织规模、服务范围、企业客户数量上均为业内前列,先后获得包括Gartner、IDC、CCID在内的众多专业咨询机构的认可。并于2018年入选福布斯中国非上市潜力企业榜50强,工信部中国电子信息产业发展研究院与中国大数据产业生态联盟“中国大数据企业50强”。
cms官网:http://www.finereport.com/product/download
下载地址:(官网版本已修复,可自行百度其他下载网址)

本文所涉及的漏洞仅局限于HW期间所报的漏洞预警,包括任意文件读取和后台GETSHELL漏洞。
(poc已打码,见谅~)

任意文件读取漏洞

漏洞代码位于fr-chart-8.0.jar文件的com.fr.chart.web.ChartGetFileContentAction中

这里由ActionNoSessionCMD类扩展而来,跟进这个类其实就是对用户权限做一个简单的认证,实际上帆软报表在具体函数里会自定义认证模式,所以这个类可以略过。

这里通过request将文件名传进来,同时这里使用了cjkDecode函数来解密文件名,但跟进这个函数就会发现对我们所传入的文件名没有任何影响,继续跟进
接着使用invalidResourcePath函数来验证文件名是否存在

public static boolean invalidResourcePath(String paramString) 
{ 
return (StringUtils.isEmpty(paramString) || paramString.indexOf(false) != -1) ? true : (paramString.startsWith("http") ? ((paramString.indexOf("127.0.0.1") != -1 || paramString.indexOf("localhost") != -1)) : ((paramString.indexOf("..") != -1 && paramString.split("\\Q..\\E").length > 3))); 
}

初步看来应该是为了防止ssrf?但对这个任意文件读取漏洞而言依旧没有任何影响。

最后使用了readResource函数来去读文件流,将其显示浏览器当中,这里其实在初步审的时候其实是有一点问题的,那就是文件的默认路径,这里必须要跟进这个FRContext类中去看看如何初始化文件默认路径,由于跟的过程比较复杂,最终发现默认是访问resources目录下的文件

这里面较为关键的是privilege.xml,因为其中存储的就是超级管理员的账号和加密密码,在官网补丁中推荐的修补建议是加大密码强度,但实际情况是这里面的解密函数已经内置在jar包里,并且使用了硬编码的方式,所以如果能够拿到加密字符串,等同于拿到了管理员账号和密码


至此利用任意文件读取漏洞可以拿到管理员的账号和密码,从而进入到后台。

后台GETSHELL漏洞


漏洞代码位于fr-platform-8.0.jar包中的com.fr.fs.plugin.op.web.action.InstallFromDiskAction

这对应的其实是后台的插件上传功能,但是这里面比较另类的这里的插件包名固定为“temp.zip”,其中上传目录为"tmp"目录,但是我们需要将zip包解压缩获取到我们所上传的shell文件,所以查看全局代码的解压缩功能,找到一个能够配合上的函数,代码位于com.fr.fs.plugin.op.web.action.UpdateFromDiskAction

这里在插件管理模块需要更新本地插件,由于会将更新插件和原始插件进行比较,所以当上传一个新的插件时会触发installPluginFromUnzipperDir函数

这个函数里面会将zip包中的文件给提取到当前目录中,从而将我们上传的jsp shell传到目标服务器中,但是由于所有的环境变量都是在WEB-INF目录下,所以tmp目录下的文件从外部访问是访问不到的,所以下面还需要找一个文件重定向的漏洞将jsp文件给移出来

文件重定向漏洞

漏洞代码位于com.fr.fs.web.service.ServerConfigManualBackupAction中

这里代码比较简单点,传入“edit_backup”,进入到条件语句当中,然后传入原始文件名和新的文件名,但是这里需要注意的这里将默认目录名设置为“frbak”目录,因此在进行目录穿越的时候需要在本地进行调试。

最后利用文件重命名漏洞将shell文件移动网站根目录,成功GETSHELL~

其实除开这两个漏洞,帆软报表在文件处理上和授权访问接口上还有很多问题,只是想要getshell目前只发现插件上传这一条路。
等发现一条不错的攻击链再公布其他漏洞吧。。

上述如有不当之处,敬请指出~


文章来源: http://xz.aliyun.com/t/5652
如有侵权请联系:admin#unsafe.sh