漏洞简介
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>的逻辑是这样的(步步拆解):
- 解析阶段:JSP页面被编译成Servlet类时,
<jsp:forward>会被转换成Java代码,类似于request.getRequestDispatcher("target.jsp").forward(request, response);。 - 执行阶段:
- 当代码运行到这个标签时,JSP会立即停止当前页面的剩余执行(包括后面的HTML或脚本)。
- 检查目标页面是否存在,如果不存在,会抛出异常(比如404)。
- 把当前request和response对象传递给目标页面。
- 目标页面开始执行,并生成响应内容,最终返回给浏览器。
- 注意事项:
- 转发后,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 文件内容.


