从铭飞CMS看JAVA代码审计流程
字数 1728 2025-08-30 06:50:11
铭飞CMS Java代码审计实战指南
前言
铭飞CMS是一个基于Mybatis+Spring组合的企业级内容管理系统,其漏洞类型丰富,非常适合新手进行Java代码审计的学习和实践。本文将从审计流程入手,详细讲解如何一步步发现系统中的各类漏洞。
环境搭建
源码获取
源码地址:https://gitee.com/mingSoft/MCMS/releases/tag/5.2.8
部署方式
-
IDEA Spring Boot启动:
- 直接使用IDEA导入项目并运行
-
War包部署:
- 取消pom.xml中的war注释
- 执行
mvn clean package - 将生成的war包放入Tomcat的webapps目录
数据库配置
配置文件路径:src\main\resources\application-dev.yml
- 创建数据库mcms
- 导入数据
- 修改配置中的数据库账户密码
审计思路
初步分析
- 查看项目文档(md文件)了解技术架构
- 若无文档,则:
- 检查依赖库(lib)是否存在已知漏洞
- 使用静态扫描工具(如OpenSCA)扫描高危依赖
代码结构分析
- 关注Maven依赖中的官方库
- 下载完整代码以便方法跟踪
漏洞挖掘与分析
SQL注入漏洞
审计方法
- 全局搜索
$符号(Mybatis未预编译的标识) - 分析参数是否可控
- 检查过滤机制是否可绕过
漏洞点1:orderBy参数注入
- 文件:
net/mingsoft/base/dao/IBaseDao.xml - 关键代码:
$orderBy - 调用链:
IBaseDao.xml → BaseBizImpl.java → 具体接口实现 - 过滤机制:仅过滤空格,可使用内联注释绕过
- 利用数据包:
POST /ms/mdiy/formData/queryData HTTP/1.1 Host: 10.28.194.30:8080 Content-Type: application/x-www-form-urlencoded Content-Length: 25 modelId=1&orderBy=1 - 利用工具:sqlmap配合tamper脚本
漏洞点2:fieldName参数注入
- 文件:
net/mingsoft/base/biz/impl/BaseBizImpl.java - 关键代码:
$key(fieldName) - 调用接口:
/ms/mdiy/page/verify.do - 无过滤机制
- 利用数据包:
GET /ms/mdiy/page/verify.do?fieldName=1'&fieldValue=1 HTTP/1.1 Host: 10.28.194.30:8080
其他SQL注入点分析
updataBySQL接口:fields参数固定,LINK_ID被过滤countBySQL接口:无实际调用queryExcludeApp接口:存在$orderBy但被过滤
Freemarker模板注入
发现过程
- 静态扫描发现Freemarker低版本漏洞
- 后台找到模板管理功能
- 尝试写入Freemarker payload
利用payload
<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("open -a Calculator") }
代码分析
- 接口:
generateIndex.do - 调用链:
generateIndex.do → generate() → rendering() → process() - 无命令执行过滤
文件写入漏洞
发现过程
- 抓取模板写入接口:
writeFileContent.do - 分析文件后缀限制
限制分析
- 禁止上传:exe、jsp、jspx
- 配置文件路径:检查全局过滤配置
- Windows绕过:使用
::$DATA特性
文件上传+路径穿越
发现过程
- 后台模板管理上传zip功能
- 分析上传处理流程
漏洞点
- 上传接口:
uploadTemplate.do做了路径遍历过滤 - 解压接口:
unZip.do未检查zip内部文件路径 - 可构造包含
../../xxx.jsp的zip文件实现目录穿越
恶意zip生成代码
import zipfile
zip_archive = zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED)
source_file = 'xxx.jsp'
target_path_in_zip = '../../xxx.jsp'
with open(source_file, 'rb') as source_file_handler:
file_content = source_file_handler.read()
zip_archive.writestr(target_path_in_zip, file_content)
zip_archive.close()
任意文件删除
发现过程
- 后台删除栏目时带路径参数
- 全局搜索
delete方法
漏洞点
- 方法:
deleteCategoryHtml - 无路径和文件名过滤
- 可遍历删除任意文件
Shiro反序列化漏洞
基本情况
- 使用Shiro 1.8.0
- 存在默认密钥问题
- 密钥位置:
applicant.yml
利用方法
直接使用Shiro利用工具进行攻击
总结
审计要点
-
SQL注入:
- 重点搜索
$符号 - 分析参数可控性
- 检查过滤机制
- 重点搜索
-
模板注入:
- 检查模板引擎版本
- 寻找模板编辑和渲染接口
-
文件操作漏洞:
- 检查上传、解压、删除等操作
- 注意路径处理逻辑
-
框架漏洞:
- 检查Shiro、Freemarker等组件版本
- 测试默认密钥
防御建议
- 对所有用户输入进行严格过滤
- 使用预编译SQL语句
- 限制文件操作的范围和权限
- 及时更新框架组件
- 修改默认配置和密钥
通过本案例的学习,可以掌握企业级Java系统的审计方法和常见漏洞挖掘技巧。