从铭飞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

部署方式

  1. IDEA Spring Boot启动

    • 直接使用IDEA导入项目并运行
  2. War包部署

    • 取消pom.xml中的war注释
    • 执行mvn clean package
    • 将生成的war包放入Tomcat的webapps目录

数据库配置

配置文件路径:src\main\resources\application-dev.yml

  • 创建数据库mcms
  • 导入数据
  • 修改配置中的数据库账户密码

审计思路

初步分析

  1. 查看项目文档(md文件)了解技术架构
  2. 若无文档,则:
    • 检查依赖库(lib)是否存在已知漏洞
    • 使用静态扫描工具(如OpenSCA)扫描高危依赖

代码结构分析

  1. 关注Maven依赖中的官方库
  2. 下载完整代码以便方法跟踪

漏洞挖掘与分析

SQL注入漏洞

审计方法

  1. 全局搜索$符号(Mybatis未预编译的标识)
  2. 分析参数是否可控
  3. 检查过滤机制是否可绕过

漏洞点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模板注入

发现过程

  1. 静态扫描发现Freemarker低版本漏洞
  2. 后台找到模板管理功能
  3. 尝试写入Freemarker payload

利用payload

<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("open -a Calculator") }

代码分析

  • 接口:generateIndex.do
  • 调用链:
    generateIndex.do → generate() → rendering() → process()
    
  • 无命令执行过滤

文件写入漏洞

发现过程

  1. 抓取模板写入接口:writeFileContent.do
  2. 分析文件后缀限制

限制分析

  • 禁止上传:exe、jsp、jspx
  • 配置文件路径:检查全局过滤配置
  • Windows绕过:使用::$DATA特性

文件上传+路径穿越

发现过程

  1. 后台模板管理上传zip功能
  2. 分析上传处理流程

漏洞点

  • 上传接口: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()

任意文件删除

发现过程

  1. 后台删除栏目时带路径参数
  2. 全局搜索delete方法

漏洞点

  • 方法:deleteCategoryHtml
  • 无路径和文件名过滤
  • 可遍历删除任意文件

Shiro反序列化漏洞

基本情况

  • 使用Shiro 1.8.0
  • 存在默认密钥问题
  • 密钥位置:applicant.yml

利用方法

直接使用Shiro利用工具进行攻击

总结

审计要点

  1. SQL注入

    • 重点搜索$符号
    • 分析参数可控性
    • 检查过滤机制
  2. 模板注入

    • 检查模板引擎版本
    • 寻找模板编辑和渲染接口
  3. 文件操作漏洞

    • 检查上传、解压、删除等操作
    • 注意路径处理逻辑
  4. 框架漏洞

    • 检查Shiro、Freemarker等组件版本
    • 测试默认密钥

防御建议

  1. 对所有用户输入进行严格过滤
  2. 使用预编译SQL语句
  3. 限制文件操作的范围和权限
  4. 及时更新框架组件
  5. 修改默认配置和密钥

通过本案例的学习,可以掌握企业级Java系统的审计方法和常见漏洞挖掘技巧。

铭飞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 调用链: 过滤机制:仅过滤空格,可使用内联注释绕过 利用数据包: 利用工具:sqlmap配合tamper脚本 漏洞点2:fieldName参数注入 文件: net/mingsoft/base/biz/impl/BaseBizImpl.java 关键代码: $key (fieldName) 调用接口: /ms/mdiy/page/verify.do 无过滤机制 利用数据包: 其他SQL注入点分析 updataBySQL 接口:fields参数固定,LINK_ ID被过滤 countBySQL 接口:无实际调用 queryExcludeApp 接口:存在 $orderBy 但被过滤 Freemarker模板注入 发现过程 静态扫描发现Freemarker低版本漏洞 后台找到模板管理功能 尝试写入Freemarker payload 利用payload 代码分析 接口: generateIndex.do 调用链: 无命令执行过滤 文件写入漏洞 发现过程 抓取模板写入接口: writeFileContent.do 分析文件后缀限制 限制分析 禁止上传:exe、jsp、jspx 配置文件路径:检查全局过滤配置 Windows绕过:使用 ::$DATA 特性 文件上传+路径穿越 发现过程 后台模板管理上传zip功能 分析上传处理流程 漏洞点 上传接口: uploadTemplate.do 做了路径遍历过滤 解压接口: unZip.do 未检查zip内部文件路径 可构造包含 ../../xxx.jsp 的zip文件实现目录穿越 恶意zip生成代码 任意文件删除 发现过程 后台删除栏目时带路径参数 全局搜索 delete 方法 漏洞点 方法: deleteCategoryHtml 无路径和文件名过滤 可遍历删除任意文件 Shiro反序列化漏洞 基本情况 使用Shiro 1.8.0 存在默认密钥问题 密钥位置: applicant.yml 利用方法 直接使用Shiro利用工具进行攻击 总结 审计要点 SQL注入 : 重点搜索 $ 符号 分析参数可控性 检查过滤机制 模板注入 : 检查模板引擎版本 寻找模板编辑和渲染接口 文件操作漏洞 : 检查上传、解压、删除等操作 注意路径处理逻辑 框架漏洞 : 检查Shiro、Freemarker等组件版本 测试默认密钥 防御建议 对所有用户输入进行严格过滤 使用预编译SQL语句 限制文件操作的范围和权限 及时更新框架组件 修改默认配置和密钥 通过本案例的学习,可以掌握企业级Java系统的审计方法和常见漏洞挖掘技巧。