SpringBoot框架介绍数据库操作Mybatis注入JDBC注入

news2024/11/15 13:36:57

目录

0x00 前言

0x01 SpringBoot框架介绍

1、SpringBoot实现简单的 GET、POST 请求

2、SpringBoot 实现数据库操作

0x02 JDBC&Mybatis注入

0、环境及靶场介绍 - Hello-Java-Sec

1、JDBC 注入

2、Mybatis 注入

3、代码审计案例 - inxedu 后台 MyBatis 注入


0x00 前言

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢! 

个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser's Blog

0x01 SpringBoot框架介绍

1、SpringBoot实现简单的 GET、POST 请求

创建一个SpringBoot的项目,左侧选择 Spring Initializr,Server URL默认是 start.spring.io,可换成阿里云的 start.aliyun.com 更快,设置完成点击 Next

阿里云默认选择 2.6.13 的 SpringBoot 稳定版本,这里 Dependencies 勾选 Web - Spring Web 以测试简单的 GET、POST 请求,然后点击 Finish 即可

创建好的项目里,SpringBootTestDemoApplication 是整个的入口点,而 demos.web 可以直接删除

创建一个 IndexController,测试 GET、POST 方法(新建一个 controller 文件夹)

1、路由映射
@RequestMapping、@GetMapping、@PostMapping

2、参数传递
@RequestParam

3、数据响应
@RestController、@Controller
(@RestController注解相当于 @ResponseBody+@Controller 合在一起用的效果)

以下只截取部分测试结果:(有参数 GET 方式、有参数 POST 方式)

2、SpringBoot 实现数据库操作

创建一个新的 Spring 项目,Dependencies 勾选 Web - Spring Web、SQL - Mybatis Framework 和 MySQL Driver,用以测试数据库功能

创建完成后,可以看到 pom.xml 里面已经自动导入了 Dependency 信息

然后配置数据库的连接信息,默认的配置文件是 application.properties,在 resources 文件夹下面,将其后缀改为 .yml 然后进行配置,这里我使用 PHPStudy 开启的 MySQL(5.7.26版本)

创建一个 User 类,用于操作数据库数据,设置好 get、set、toString 方法(新建一个 entity 文件夹)

创建一个 UserMapper(创建的时候选择 “接口” ),定义了 findAll 和 findByID 两个方法(新建一个 mapper 文件夹)

创建一个 GetStuController,调用 findAll 和 findByID 两个方法(新建一个 controller 文件夹)

访问 http://localhost:8080/getallstu,测试结果如下:

访问 http://localhost:8080/getbyid,测试结果如下:

0x02 JDBC&Mybatis注入

0、环境及靶场介绍 - Hello-Java-Sec

环境:JDK 1.8、MYSQL 5.7.26

靶场:Hello-Java-Sec

Github地址:https://github.com/j3ers3/Hello-Java-Sec

1、JDBC 注入

JDBC 有两个方法执行 SQL 语句,分别是 PrepareStatement 和 Statement。

下面展示漏洞代码:

  • 以下为采用 Statement 方法拼接 SQL 语句,导致 SQL 注入

此图片的alt属性为空;文件名为image-24.png

  • 以下为使用 PrepareStatement 预编译,但却采取拼接的方式构造 SQL,此时进行预编译也无用

此图片的alt属性为空;文件名为image-25.png

  • 以下为使用 JDBCTemplate,JDBCTemplate 是 Spring 对 JDBC 的封装,如果使用拼接语句便会产生注入

此图片的alt属性为空;文件名为image-26.png

下面展示安全代码:

  • 以下为采用黑名单过滤危险字符,同时也容易误伤(次方案)

此图片的alt属性为空;文件名为image-27.png

  • 以下为使用 PrepareStatement 预编译,使用?作为占位符,进行参数化查询

此图片的alt属性为空;文件名为image-28.png

  • 以下为使用 ESAPI 安全框架,ESAPI 是一个免费、开源的、网页应用程序安全控件库,它使程序员能够更容易写出更低风险的程序

此图片的alt属性为空;文件名为image-29.png

  • 以下为强制数据类型,强制转为数值型,SQL 语句无法拼接字符串,因此不存在注入

2、Mybatis 注入

MyBatis 支持两种参数符号,一种是 #,另一种是 $,# 使用预编译,$ 使用拼接 SQL。

Mybatis 框架下易产生 SQL 注入漏洞的情况主要分为以下三种。

  • order by 注入

漏洞成因为:由于使用 #{} 会将对象转成字符串,形成 "order by 'user' desc" 导致报错(SQL 规定 order by 的字段名不能是字符),因此很多开发会采用 ${} 来解决,从而造成 SQL 注入

正确的写法应为:使用排序映射

此图片的alt属性为空;文件名为image-33.png

  • 搜索框 like 注入

漏洞成因为:模糊搜索时,直接使用 '%#{q}%' 会报错,部分开发图方便直接改成 '%${q}%' 从而造成注入

此图片的alt属性为空;文件名为image-34.png

正确的写法应为:使用 # 号并使用 concat 连接

此图片的alt属性为空;文件名为image-35.png

  • in 之后多个参数的注入

漏洞成因为:在这种需求场景下使用 # 同样会报错,于是部分开发图方便就把 # 号改成了 $ 从而造成注入

此图片的alt属性为空;文件名为image-36.png

正确的写法应为:使用 foreach 遍历

此图片的alt属性为空;文件名为image-37.png

3、代码审计案例 - inxedu 后台 MyBatis 注入

环境:JDK 1.8、MYSQL 5.2.17

Inxedu 介绍:因酷时代 Inxedu 在线教育系统 V2.0.6 是一个开源的网校项目

项目搭建:

IDEA 打开 inxedu 项目,选择 Maven Project,然后修改数据库配置(project.properties),并导入相关 .sql 文件执行

此图片的alt属性为空;文件名为image-38.png

然后设置 Tomcat 启动,注意修改对应端口为前面设置的 82

此图片的alt属性为空;文件名为image-41.png

在 Deployment 里设置 Application context 为 /,和配置文件里的项目路径保持一致

此图片的alt属性为空;文件名为image-40.png

代码审计:

首先看一下该项目用了什么组件,在 External Libraries 里发现其使用了 Mybatis

根据之前的分析,我们知道 Mybatis 下的 SQL 注入有 3 种,分别为 order by 注入、搜索框 like 注入、in 之后多个参数的注入,根据其漏洞代码的特征去项目里面搜索:

  • order by 注入,其漏洞代码特征为 ${
  • 搜索框 like 注入,其漏洞代码特征为 %${
  • in 之后多个参数的注入,其漏洞代码特征为 (${

这里以 in 之后多个参数的注入为例,搜索结果如下,定位到 ArticleMapper.xml(全局搜索快捷键 ctrl+shift+f)

此图片的alt属性为空;文件名为image-43.png

得到 id 值为 deleteArticleByIds,然后搜索该 id 继续定位,看哪里调用了它

搜索结果如下,定位到 AdminArticleController.java

此图片的alt属性为空;文件名为image-45.png

根据路由信息 @RequestMapping 得知,此功能点大概率为后台文章删除操作

此图片的alt属性为空;文件名为image-48.png

此图片的alt属性为空;文件名为image-47.png

进入网站后台(默认账号密码 admin 111111)

此图片的alt属性为空;文件名为image-53.png

测试文章删除功能点是否存在 SQL 注入,随便删除一篇文章,然后抓包

此图片的alt属性为空;文件名为image-50.png

此图片的alt属性为空;文件名为image-51.png

新建一个 txt 写入请求然后让 SQLMap 跑(不然 SQLMap 进不了后台),测试结果为存在 SQL 注入

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

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

相关文章

神经网络Python实现(9行代码)

1. 神经网络简介 神经网络由输入层、输出层和之间若干层(一层或多层)隐含层构成,每一层可以有若干个节点。层与层之间节点的连接状态通过权重来体现。 下面介绍一下单个神经元: 输入节点:x1,x2 权重:w1,w…

27.BGP边界网关路由协议

BGP边界网关路由协议 外部网关路由协议 ospf能承载的路由条目有限 用在运营商与运营商之间,国与国之间 BGP运行在IGP之上(内部网关路由) IGP都是在物理链路上直连的基础之上才能建立邻居关系,BGP可以跨路由器建立邻居关系&…

Postman进行参数化的2种方式

前言 Postman作为一款接口测试工具,受到了非常多的开发工程师的拥护。 那么做为测试,了解Postman这款工具就成了必要的了。 这篇文章就是为了解决Postman怎么进行参数化的。 同时,我也为大家准备了一份软件测试视频教程(含面试、…

为“EYE”加码,蔡司光学公益助童活动走进湖南省宁乡市

为不断强化品牌的责任担当,用公益传递社会正能量。2023年11月28日,国内眼视光领域领导品牌蔡司光学携手海南精功眼镜走进湖南省宁乡市青少桥初级中学开展蔡司公益助童行动,全校共504名学生参与其中。 因爱而生,接续传递“EYE”的美…

arcmap + oracle11g 迁移数据 报错 copyFeatures失败

原因排查: 1.通过这个界面,我们无法查到真正的原因, 2.将数据拷贝到我们自己的arcmap服务器中,采用 单个要素 导入,从result面板中查找原因; 从上面这个图中,看到关键信息 DBMS error ORA-016…

Opencv入门五 (显示图片灰度值)

源码如下&#xff1a; #include <opencv2/opencv.hpp> int main(int argc, char** argv) { cv::Mat img_rgb, img_gry, img_cny; cv::namedWindow("Example Gray",cv::WINDOW_AUTOSIZE); cv::namedWindow("Example Canny", cv::WINDOW_…

数据隐私治理所面临的四大挑战

PrimiHub一款由密码学专家团队打造的开源隐私计算平台&#xff0c;专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。 近年来&#xff0c;隐私功能越来越受到重视&#xff0c;在重大立法改革和加强监管审查的支持下&#xff0c;各组织通过部署和扩展…

07.stack 容器

7、stack 容器 概念&#xff1a; stack 是一种先进后出&#xff08;First In Last Out&#xff0c;FILO&#xff09;的数据结构&#xff0c;它只有一个出口 栈中只有顶端的元素才可以被外界使用&#xff0c;因此栈不允许有遍历行为栈中进入数据称为 — 入栈 push栈中弹出数据…

清理优化,卸载高效——PP Cleaner Uninstaller Pro for Mac

随着时间的推移&#xff0c;Mac电脑上的垃圾文件和无用程序可能会逐渐积累&#xff0c;影响电脑的性能和运行速度。为了解决这个问题&#xff0c;我们推荐您使用PP Cleaner & Uninstaller Pro for Mac软件&#xff0c;它是一款专业的清理和卸载工具&#xff0c;能够帮助您保…

基于ssm作业提交与查收系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本作业提交与查收系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信…

多对多关系通用操作组件,省时省力的神器

项目上有很多对多操作的场景&#xff0c;建对象&#xff0c;建mapper接口&#xff0c;设置查询条件&#xff0c;查询多对多数据等都是一项极为耗时耗力的工作。因此&#xff0c;搓了这款集建表-保存-查询-设置条件等操作于一体的组件。原理简单&#xff0c;利用$标签动态作些操…

【自动化测试】selenium元素定位方式大全!

前言 当我们在使用selenium进行自动化测试工作时&#xff0c;元素定位是非常重要的一环&#xff0c;因为我们是借助脚本模拟我们通过鼠标和键盘对元素进行点击、输入内容和滑动操作的&#xff0c;所以准确的元素定位是我们执行测试脚本的重要一环。本文就来给大家介绍一下sele…

windows11 ssd掉盘(无法访问)

故障描述&#xff1a; 开机的时候能够正常访问SSD当使用电源的时候很容易SSD无法访问接入电源以后掉盘情况缓解 故障原因&#xff1a;win11加入了一个新的电源策略 更改高级电源设置&#xff08;默认是10/20&#xff09;&#xff0c;把这个参数调整大。 非常蠢的一个设计&…

信号处理基础之噪声与降噪(二)| 时域降噪方法(平滑降噪、SVD降噪)python代码实现

接上期信号处理基础之噪声与降噪(一) | 噪声分类及python代码实现&#xff0c;本期为大家介绍噪声评价指标&#xff0c;并且讲解两种降噪方法——平滑降噪、SVD降噪&#xff0c;并给出python代码。 信号处理基础之噪声与降噪(二&#xff09;| 时域降噪方法&#xff08;平滑降噪…

Z Potentials | 叶生晅:生成式 AI 下不变的是需求,坚定成为客户的营销技术合伙人

移动互联网时代&#xff0c;视频、直播、兴趣电商、社交、新资讯等线上新平台新服务实现大发展&#xff0c;吸引用户加速融入日益不可或缺的线上生活和「线上线下」融合场景&#xff0c;铸就海量的流量红利。营销场景从来都是软件应用行业最大的市场&#xff0c;离客户的预算最…

基于ssm双星小区物业管理系统的设计与实现论文

摘 要 传统办法管理双星小区物业信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装双星小区物业管理系统软件来发挥其高效地信息处…

【性能测试】登录接口性能压测+选择并发用户数总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、需要登录的接口…

jvm相关命令操作

查看jvm使用情况 jmap -heap PID 查看线程使用情况 jstack pid 查看当前线程数 jstack 21294 |grep -E (#[0-9]) -o -c 查看系统线程数 top -H top -Hp pid #查看具体的进程中的线程信息 使用 jps 命令查看配置了JVM的服务 查看某个进程JVM的GC使用情况 jstat -gc 进程…

配置 vim 默认显示行号 行数 :set number

vi ~/.vimrc 最后添加一行 :set number保存退出&#xff0c;再次 vim 打开文件&#xff0c;默认就会显示行号了

ctfshow(web190-web200)

目录 web190 web191 web192 web193 web194 web195 web196 web197 web198 web199 web200 web190 为什么要有admin呢 这也是试出来的 这个admin必须是数据库中存在的 这样才能使用布尔注入 因为这个时候登录 有两种返回结果 一种密码错误 一种就是用户名错误 admin an…