【审计思路】如何快速定位SQLMS注入漏洞?

news2024/9/22 9:54:44

0x00 前言

MCMS是政府、教育等其他行业常用的CMS,应用广泛,但是底层的代码中仍然遗留不少的问题。这篇文章主要针对SQL注入进行审计并探讨如何快速定位SQL注入漏洞,以及其他工具的应用。

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

0x01 审计环境

Mingsoft MCMS v5.2.8
Mysql 8.0.29
Openjdk 19.0.1

0x02 审计思路

现代做代码审计的工具市面上已经有很多了,在拿到源码的时候,第一时间当然是先使用工具进行扫描,节省人工时间。尽管有fortify、奇安信代码卫士这些工具在,但避免不一些纰漏,仍然需要人工经验的判断。

利用自动化代码审计工具

这里我们使用 fortify 工具对源码进行扫描,记录了我遇到的两个问题。该 fortify 工具为收费工具,本文不提供破解版的下载方式。

【一一帮助安全学习,所有资源获取处一一】
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

1.反编译 jar 包

使用 fortify 导入MCMS 源码进行代码审计,但效果往往不如意。因为这一套源码使用 Maven 作为项目管理工具软件,其中包括依赖管理,MCMS项目依赖的jar包都是远程拉取的。其中net.mingsoft.ms-base、ms-basic、ms-mdiy为底层逻辑代码。拉取的时候是以jar包的形式存在的,而自动化工具不会对jar包进行扫描。

图片.png

我们可以将 jar 包重命名为 zip,然后解压就能获得 class 文件。但 fortify 同样不会扫描 class 文件,我们需要进一步反编译。这里我们可以使用 jadx 进行反编译。
图片.png

我们可以直接打开 jar 文件,通过快捷键 Control+S 将反编译后的资源进行保存。

图片.png

导出之后就是 java 文件,是可以被扫描的文件类型。

图片.png

2.不扫描 JS 文件

在扫描代码的实践中,我遇到 JS 文件数量过多情况,导致整体的扫描进度大幅度拉长,这不是我想要的。
找到 fortify/Core/config 目录下的 fortify-sca.properties

图片.png

其中 com.fortify.sca.DefaultFileTypes 一项规定了被扫描文件的类型。我们把其中的 ,js删掉就可以了。

图片.png

人工审计SQL注入思路

造成SQL注入一般需要满足以下两个条件:
(1)输入参数内容用户可控。
(2)直接或间接拼入SQL语句执行。
且在执行SQL语句时有不同的方式:
(1)直接使用 JDBC 的类方法。
针对这种执行SQL语句的方式,我们可以全局搜索 SELECT、DELETE、UPDATE 等 SQL 关键词或者搜索 Statement、PreparedStatement方法名称来定位执行语句的地方。
(2)使用 MyBatis 持久化层作SQL语句执行代理。
MyBatis 持久化层中一般使用 #{} 在底层实现上使用 “?”作为占位符,是预编译的机制。在实践过程中,类似order by等不能使用单引号的地方都不可以使用预编译,转而使用 ${}直接拼接到SQL语句中。一般这种情况需要手动增加内容的严格过滤步骤。所以尽管预编译很强大但也有用不上的地方,而这些地方就是我们的突破口。

0x03 审计过程

由上面的描述可以知道使用 ${}的地方往往可能存在SQL注入风险,所以我们审计过程中可以直接全局搜索${}

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

原因

在SQL持久化层 IBaseDao.xml 文件中可以看到绑定id 为 sqlWhere 的 Sql 映射里使用了 ${} 导致存在SQL注入的风险。
图片.png

第一处 GET类型

在 IDictDao.xml 中引入 IBaseDao.xml 映射语句。

图片.png

在 IDictBiz 这个业务层是继承了 IBaseBiz 从而有 query 确定返回类型为 DictEntity。

图片.png

在控制层 web/DictAction.class 中可以看到这里请求数据包的数据变成了实体,然后直接传入 dictBiz.query 中。
图片.png

我们请求这个接口时,所有传入的参数与值会别当作 DictEntity,所以这里直接传 sqlWhere 即可。

图片.png

sqlWhere的值为 [{"action":"","field":"extractvalue(0x7e,concat(0x7e,(database())))","el":"eq","model":"contentTitle","name":"文章标题","type":"input","value":"a"}]

第二处 GET 类型

在 IDictDao.xml 中引入 IBaseDao.xml 映射语句。id 为 queryExcludeApp

图片.png

在控制层 web/DictAction.class 中可以看到这里请求数据包的数据变成了实体,然后直接传入 dictBiz.queryExcludeApp中。

图片.png

同样的这里所有传入的参数与值会别当作 DictEntity,存在同样的问题。
图片.png

第三处 POST类型

在 ICategoryDao.xml 中引入 IBaseDao.xml 映射语句。
图片.png

在控制层 web/CategoryAction.java 中可以看到这里请求数据包的数据变成了实体,然后直接传入categoryBiz.query 中。

图片.png

这里的实体类型有了变化,但不妨碍我们传入 sqlWhere导致漏洞的执行。

图片.png

第四处 POST类型

在 IContentDao.xml 中引入 IBaseDao.xml 映射语句。

图片.png

在控制层 web/ContentAction.java 中可以看到这里请求数据包的数据变成了实体,然后直接传入contentBiz.query 中。

图片.png

只要引入之后,如果没有过滤都是存在漏洞的。

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

在持久化层 IBaseDao.xml 中存在一处绑定了 id 为 excuteSql 的 SQL 操作语句。该地方直接执行了传入 SQL 语句。

图片.png

持久化层代理 IBaseDao.class 写好了对应 IBaseDao.xml 的接口
图片.png

IModelDao.class 继承了 IBaseDao 确定了类型为 ModelEntity

图片.png

图片.png

业务层 IModelBiz.class 定义了一些接口

图片.png

业务实现层 ModelBizImpl.class 实现了 IModelBiz.class 接口,通过阅读代码,可以发现实际上在 importModel 函数里面使用了 IModelDao.class 中的 excuteSql 方法。

图片.png

在控制层 ModelAction.class 中 importJson 函数里调用了 ModelBizImpl.class 的 importModel 函数。

图片.png

该漏洞产生位置存在后台自定义模型的导入功能处,要使用该功能需要到 https://code.mingsoft.net/ 生成代码。

图片.png

新建业务表单 ——> 拖动表单组件 ——> 填写字段名和默认值 ——> 生成代码

图片.png

可以看到生成的自定义模型代码,我们复制出来将 sql 字段的 value 改成我们自定义的即可。

图片.png

任意都行没有过滤和限制,语句的行是通过 split(';')来分割的。

图片.png

这个其实是MCMS的核心业务,无法避免的使用,所以只要使用 MCMS 拥有自定义模型的导入功能的权限就可以利用SQL注入获取数据或者系统权限。

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

因为使用了 mybatis 框架这里就全局搜使用 $ 进行拼接的,发现在/net/mingsoft/ms-base/2.1.13/ms-base-2.1.13.jar!/net/mingsoft/base/dao/IBaseDao.xml

图片.png

进一步跟进queryBySQL

图片.png

查看对应接口中的实现方法

图片.png

然后在/net/mingsoft/base/biz/impl/BaseBizImpl.java这里进行了重写queryBySQL,然后调用getDao().queryBySQL

图片.png

然后发现在/net/mingsoft/basic/action/BaseAction.class#validated 验证的时候进行调用
图片.png

继续跟,这时候只要找到前端路由中能调用validated就可以了,然后发现在/net/mingsoft/ms-mdiy/2.1.13.1/ms-mdiy-2.1.13.1-sources.jar!/net/mingsoft/mdiy/action/PageAction.java#verify
调用了validated方法

图片.png

寻找路由,通过分析我们这个是个GetMapping 然后参数fieldName、fieldValue、id、idName 随便构造一下,最开始我们看到的key对应的就是前端传进来的fieldName

图片.png

http://127.0.0.1:8008/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
fieldName`是传入了 `${key}直接拼接到SQL语句导致SQL注入。

图片.png

0x04 总结

代码审计论证了预编译不是万能的,否则不会出现这么多的 SQL 注入漏洞。在不能使用预编译处理参数值,只能通过拼接进行操作的地方,除了手工写过匹配危险字符滤函数之外还有什么方法吗?我们还可以严格要求传入的参数类型,例如数字的地方将用户输入的内容进行强制转化成 int 不行就报错处理,这种称之为表单过滤层。如果我们的代码体积庞大无法花费大量人力去排查漏洞存在,可以购买安全公司的代码审计服务和WAF防火墙产品。

0x05 参考

*   [https://gitee.com/mingSoft/MCMS/issues/I5OWGU](https://gitee.com/mingSoft/MCMS/issues/I5OWGU)
*   [https://gitee.com/mingSoft/MCMS/issues/I5X1U2](https://gitee.com/mingSoft/MCMS/issues/I5X1U2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[ vulhub漏洞复现篇 ] Apache Airflow Celery 消息中间件命令执行漏洞复现 CVE-2020-11981

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

基于asp.net企业网上办公自动化系统-计算机毕业设计

企业网上办公自动化通过对各办公自动化要素的闭环整合,实现了工作流、信息流、知识流和办公自动化系统的整合管理,提供了一个科学、开放、先进的信息化办公平台,实现办公自动化,并进行远程办公或在家办公。企业网上办公自动化将人…

redis开启二级缓存

目录 1. redis集成 2. pom.xml加入redis缓存支持 3. 在项目配置文件中加入cache配置 4. 在启动类开发缓存功能 5. 需要缓存的实体对象实现序列化接口 6. 缓存的使用 7. 测试 今天与大家分享,redis二级缓存实现案例。如有问题,望指教。 1. redis集…

计算机毕业设计springboot+vue基本微信小程序的校园二手物品交易平台系统

项目介绍 目的:设计一个同学们能自由发布和浏览求购或卖出商品信息的校园二手交易小程序,解决信息的不流通以及传统二手商品信息交流方式的笨拙等问题。 意义:在大学校园里,存在着很多的二手商品,但是由于信息资源的不流通以及传统二手商品信息交流方式的笨拙,导致了很多仍然具…

十年阿里测试工程师浅谈UnitTest单元测试框架

一、UnitTest单元测试框架提供了那些功能 1.提供用例组织和执行 如何定义一条“测试用例”? 如何灵活地控制这些“测试用例”的执行? 2.提供丰定的断言方法 当测试用例的执行结果与预期结果不一致时,判定测试用例失败。在自动化测试中,通过“断言”…

2022 软件测试简答题【太原理工大学】

四、简答题 1. 比较自顶向下集成测试方法和自底向上集成测试方法各自的优缺点。 ① 自顶向下集成 优点:较早地验证了主要控制和判断点:按深度优先可以首先实现和验证一个完整的软件功能;功能较早证实,带来信心;只需一个驱动,减少驱动器开发…

python+pyqt5设置窗体图标和任务栏图标及窗体标题的方法

本次设置窗体标题只用了一种方法,在进行窗体实例化后window Window(),使用setWindowTitle(str)命令,在主程序中的设置命令如下所示: if __name__ __main__:QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) #Qt从5.6.0开…

机器学习——05线性回归

机器学习——05线性回归 参考资料 AIlearningMachine-Learning-in-Action庞善民.西安交通大学机器学习导论2022春PPT 使用Jupyter进行练习,python3 具体项目地址:https://github.com/yijunquan-afk/machine-learning/tree/master/basic-learn/05-reg…

ARM S5PV210 X210 刷机教程总结

前言 S5PV210 X210 开发板外观介绍 一、开发板刷系统1 1. 什么是刷系统 刷系统就是利用刷机工具,向开发板中烧录预先编译好的系统镜像,使之在开发板上运行起来。 2. 串口输出的意义(做系统控制台) 串口是一种硬件通信口&…

【将高光谱、多光谱和全色图像进行融合】

HyperNet: A deep network for hyperspectral, multispectral, and panchromatic image fusion (HyperNet:一种用于高光谱、多光谱和全色图像融合的深度网络) 传统的方法主要是将高光谱图像(hyperspectral image (HSI)&#xff0…

定时红绿灯(C51单片机)

一.项目题目:利用中断处理制作的定时LED红绿灯系统 二.项目器件: 红色LED灯 绿色LED灯 黄色LED灯 100R电阻 电源 电容器 C51单片机 接地线 三.项目原理图 四.项目实现功能: 使用定时器/计数…

【云原生 | Kubernetes 实战】14、K8s 控制器 Statefulset 入门到企业实战应用

目录 一、Statefulset 控制器:概念、原理解读 1.1 什么是有状态服务? 1.2 什么是无状态服务? 二、 Statefulset 资源清单文件编写技巧 三、Statefulset 使用案例:部署 web 站点 3.1 StatefulSet 由以下几个部分组成&#xf…

VMware克隆虚拟机

一、克隆虚拟机 1. 在WMware中,右键虚拟机模板(需要克隆的虚拟机原型),选择:管理 ----> 克隆,如下图所示: 2. 然后,如下图进行操作: 二、扩展:移除、删除…

【Python】 14-CVS文件操作

1.CVS文件 值没有类型,所有东西都是字符串; • 没有字体大小或颜色的设置; • 没有多个工作表; • 不能指定单元格的宽度和高度; • 不能合并单元格; • 不能嵌入图像或图表。 CSV 文件中的每个单元格 有逗…

【JavaSE基础:数据类型和变量】

数据类型一、数据类型1.八大基本数据类型二、变量0.字面常量1.变量1)数值类型a.整型b.浮点型2)字符类型(char)3)布尔类型(boolean)2.类型转换3.类型提升一、数据类型 Java是一种强类型编程语言…

[思维模式-6]:《如何系统思考》-2- 认识篇 - 为什么要系统思考?系统思考是系统架构师、系统设计师的基本技能

目录 前言:系统思考的关键字 第1章 系统思考的作用 1.1 系统思考能够化繁为简 1.2 系统思考是敏捷成长和解决问题的系统方法 第2章 常见缺乏系统思考的表现 2.1 分解思维盛行的不足 2.2 面积上:只见树木,不见深林 2.3 时间上&#xf…

Tippecanoe安装使用

Tippecanoe安装使用 介绍 tippecanoe是mapbox官方提供的一个开源矢量切片工具,用C语言编写的。 Tippecanoe 的目标是为您的数据制作一个与比例无关的视图,以便在从整个世界到单个建筑物的任何级别上,您都可以看到数据的密度和纹理&#xf…

02---前端框架搭建

1、创建项目 1.该有的nodejs 、vue都要安装上,我用的是vuecli3,所以可以使用可视化界面 来创建项目(更加直观),当然你也可以采用命令行的方式创建项目。 2.cmd命令行输入: vue ui 3.在打开的可视化页面中…

基于asp.net193酒店客房预订网站系统-计算机毕业设计

项目介绍 本酒店系统使用asp.net技术制作,在前台为普通用户提供预定和查询等系统使用功能,在后台为酒店管理员提供对系统平台的管理功能。在前台为用户提供的操作功能包括以下内容:站内新闻、用户注册、酒店查看,留言板等功能。此系统为管理…

AMAIZINGIC晶焱科技:Wi-Fi 6E 路由器产品的ESD/EOS防护方案

AMAIZINGIC晶焱科技:Wi-Fi 6E 路由器产品的ESD/EOS防护方案 随着无线网路的发展,IEEE协会于2020年提出了最新的Wi-Fi 6E,此版本为Wi-Fi 6的延伸版本,除了Wi-Fi 6原先支援的2.4GHz及5GHz的频段外,新增了6GHz的频段&…