某报表v8.0 Getshell漏洞分析

2019-07-17 约 82 字 预计阅读 1 分钟

声明:本文 【某报表v8.0 Getshell漏洞分析】 由作者 ADog 于 2019-07-17 09:02:00 首发 先知社区 曾经 浏览数 220 次

感谢 ADog 的辛苦付出!

cms简介

南京帆软软件有限公司(以下简称“帆软”)成立于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目前只发现插件上传这一条路。
等发现一条不错的攻击链再公布其他漏洞吧。。

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

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now