【Java代码审计 | 第三篇】SQL注入之Hibernate、MyBatis

为什么90%的开发者放弃使用Hibernate,而选择MyBatis? Java基础教程系列,打造精品专栏。 阅读详情

未经许可,不得转载。

在这里插入图片描述

在 Java 应用程序中,常见的数据库访问方式包括 JDBC、MyBatis 和 Hibernate。其中,JDBC 的 SQL 注入风险及代码审计方法已在 【Java 代码审计 | 第二篇】SQL 注入之 JDBC 详细介绍过,本文将重点介绍 MyBatis 和 Hibernate 可能存在的安全风险及代码审计方法。

Hibernate

在 Java 开发中,Hibernate 是一种流行的 ORM(对象关系映射) 框架,它将数据库中的表与 Java 类进行映射,简化了数据库操作。通过 Spring 的依赖注入,可以轻松地与 Hibernate 集成,从而提高开发效率并减少 SQL 操作的复杂性。

以下是一个简单的 Hibernate 使用示例:

@Autowired
CategoryDAO categoryDAO; // 依赖注入

@RequestMapping("/hibernate")
public String hibernate(@RequestParam(name = "id") int id) {
    Category category = categoryDAO.getOne(id); // 使用 Hibernate 获取数据
    return category.getName(); // 返回类别名称
}

在这个例子中,CategoryDAO 是通过 依赖注入 获取的一个数据访问对象,它封装了对数据库的操作。通过 getOne(id) 方法,我们可以直接从数据库中查询指定 ID 的 Category 实体,并返回其名称。

Hibernate 默认采用 预编译 SQL 机制来执行查询。当我们使用 Hibernate 的方法时,它会自动处理查询语句并使用预编译的方式与数据库交互,从而避免了 SQL 注入风险。

然而,在某些复杂场景下,我们可能需要使用 手写 SQL。例如,当我们使用 Hibernate 的 @Query 注解或 Session.createSQLQuery() 方法时,涉及动态拼接 SQL 的场景(如 LIKE、ORDER BY、IN 等)时,Hibernate 不再自动生成 SQL 语句。

MyBatis

MyBatis 是一个持久层框架,用于简化 Java 应用程序与数据库之间的交互。它本质上是对 JDBC(Java Database Connectivity)的封装,提供了 SQL 语句的映射功能,使开发者能够更方便地执行数据库操作。

在 MyBatis 中,获取参数值的方式主要有两种:${} 和 #{}

#{}(安全,防止 SQL 注入)

#{} 解析时会转换为 SQL 预编译的占位符 ?,并使用 PreparedStatement 进行参数绑定。由于 MyBatis 通过预编译机制来自动转义参数,因此可以有效防止 SQL 注入。

示例:

<select id="getUserById" resultType="User">
    SELECT * FROM users WHERE id = #{id}
</select>

最终执行的 SQL:

SELECT * FROM users WHERE id = ?

${}(不安全,易受 SQL 注入攻击)

${} 直接将参数值拼接到 SQL 语句中,相当于字符串替换,不会使用预编译机制,因此容易受到 SQL 注入攻击。

示例:

<select id="getUserById" resultType="User">
    SELECT * FROM users WHERE id = ${id}
</select>

若用户输入 1 OR 1=1,最终执行的 SQL 可能变为:

SELECT * FROM users WHERE id = 1 OR 1=1

这将导致 SQL 注入攻击。

在 MyBatis 中,映射文件(Mapper XML) 的命名规则通常是:

表所对应的实体类的类名 + Mapper.xml

例如,若有一个 User 实体类,则其对应的 MyBatis 映射文件一般命名为:

UserMapper.xml

因此,此处的代码审计方法为:在所有 *Mapper.xml 文件中搜索 ${},查看是否有用户输入的数据直接拼接到 SQL 语句中。

MyBatis 的两种写法

注意:在 Maven 项目 中,mapper.xml 文件必须存放在 resources 目录 下,才能被 MyBatis 正确识别并加载。

MyBatis 主要提供了两种方式来执行 SQL 查询:基于注解的方式 和 基于 XML 配置的方式。

1. 基于注解的 MyBatis 写法

@Mapper
public interface CategoryMapper {
    @Select("SELECT * FROM category_ WHERE name= '${name}' ")
    CategoryM getByName(@Param("name") String name);
}

在这种方式下,SQL 语句直接写在 @Select 注解 中,MyBatis 会在运行时解析并执行该 SQL 语句。

2. 基于 XML 配置的 MyBatis 写法

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.seaii.springboot.mapper.CategoryMapper">
    <select id="get" resultType="cn.seaii.springboot.pojo.CategoryM">
        SELECT * FROM category_ WHERE id= ${id}
    </select>
</mapper>

在 XML 方式中,SQL 语句被写入独立的 mapper.xml 文件中,并通过 namespace 关联接口,实现 SQL 的分离管理。

上述代码中的 WHERE name= '${name}' 和 WHERE id= ${id} 直接拼接用户输入,可能导致 SQL 注入漏洞。

3. 解决方案

应该使用 #{} 方式 绑定参数,避免 SQL 注入问题。

基于注解

@Mapper
public interface CategoryMapper {
    @Select("SELECT * FROM category_ WHERE name= #{name}")
    CategoryM getByName(@Param("name") String name);
}

基于 XML

<select id="get" resultType="cn.seaii.springboot.pojo.CategoryM">
    SELECT * FROM category_ WHERE id = #{id}
</select>

这样,MyBatis 会自动 将参数作为占位符处理,避免 SQL 注入风险。

4.漏洞案例

让我们看看代码审计SQL注入的全流程。

1、在所有 *Mapper.xml 文件中搜索 ${}

2、如图,UserMapper.xml 中的 namespace 指向了 UserDao.java 接口,UserMapper.xml 里的每个 SQL 标签(如 <select> )的 id 属性值对应 UserDao.java 中的一个方法。并且 SQL 语句存在 nickName 及 userName。

在这里插入图片描述

来到 UserDao.java 界面后,按 “Ctrl + 鼠标右键”,查看哪些代码文件或类引用了UserDao.java中的getFuzzyUserByPage方法:

在这里插入图片描述

如上图所示,UserDao.java里的getFuzzyUserByPage方法被UserServiceImpl.java的第 45 行代码引用,执行语句为List<MyUser> fuzzyUserByPage = userDao.getFuzzyUserByPage(myUser);

跟踪到UserServiceImpl.java的第 45 行代码:

在这里插入图片描述

如上图箭头所示,userService.getAllUsersByPage方法调用时传入了MyUser类型的参数myUser 。

可以推断,MyUser.java定义了与用户相关的数据模型类,包含用户的各种属性,比如用户ID等。

上图给出了调用接口:/api/user

进入MyUser.java,确实存在用户属性:

在这里插入图片描述

因此以上是整个的传参处理流程。

由第一张图可知,${}的参数处理方式存在SQL注入,因此可直接调用接口传参payload。

在这里插入图片描述

FastAPI + LLM 实战:5分钟搞定本地模型API服务部署(含避坑指南) 本文详细介绍了如何使用FastAPI和LLM(大语言模型)快速部署本地API服务,涵盖环境准备、模型集成、性能优化及避坑指南。通过实战示例,帮助开发者在5分钟内完成从零到生产的部署过程,提升AI应用开发效率。 阅读详情

相关推荐

ESP32-CAM入门教程

ArduinoESP32-CAM下载模块(接上USB就能用,很方便,如果没有买就只有资金用USB-TTL了)如下图两个合在一起如下图。

qq_48778364的博客 3万+

JAVA代码审计之SQL注入

本章节课程主要从以下三方面详细的介绍了如何针对java代码中sql注入的审计方法及黑盒验证:1、JDBC连接方式下sql注入的存在的形态及修复方法,like、in情况在如何安全使用预处理来防范sql注入2、在使用Mybatis框架下如何审计sql注入代码,并详细的介绍了如何编写安全的数据库查询语句。3、在使用Hibernate框架下如何审计sql注入代码。并详细介绍了如何编写安全的数据库查询语句。

【FPGA】Verilog代码实现温湿度传感器DHT11

#今天也是咸鱼的一天~ 因为参加Robei 杯 是要做一个机器人,先不说这个机器人具体怎么机器法,但是和外界互通的传感器肯定少不了,通过获取外界环境数据,进行处理,然后做出各种各样的功能。 先来讲个简单的模块,温湿度传感器DHT11。 DHT11介绍 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器。它具有超小体积、极低功耗的特点。它使用单根总线与单片机进行双向的串行数据传输,信号传...

Ninquelote的博客 9162

hibernate防止sql注入的方法

刚刚进入这家公司,项目组给我分配的是一个新的系统的开发工作。当然,作为技术的沉淀,并不是完全的从无到有的。 在整合了框架以后,是将一些久经考验的基础代码给迁移到新项目中。这一次需要将持久层修改为用hibernate来实现。在编写持久层的时候,我一开始大量采用了字符串拼接的方式来完成对sql语句的编写,而这一点,被我们组里的老人善意指点了出来:“这么写,如果遇到别人恶意注入怎么办”。

menger4java的博客 6027

NRF24L01学习操作教程(二)——NRF实现一对一,一对多通讯

以上内容详细介绍了,使用NRF24L01实现1对1单向通讯、1对1双向通讯、1对多双向通讯。

Joseph Wen的博客 7389

OpenWrt国内镜像源一键切换脚本:清华/阿里/中科大源全搞定

本文介绍了OpenWrt国内镜像源一键切换脚本,支持清华、阿里和中科大三大源,自动识别设备架构和系统版本,显著提升软件包安装速度和成功率。脚本包含架构自动识别、版本适配、多源选择和配置备份等功能,适用于x86_64、ramips/mt7621等常见架构,帮助用户解决海外源访问缓慢的问题。

g5h6i的博客 1176

网络安全必学SQL注入

当找到某个变量关键词有 SQL 注入风险时,可以再根据调用链找到该存在注入风险的业务逻辑代码,查看参数来源是否安全、是否有配置SQL危险参数过滤的过滤器,最终确认是否存在SQL注入。这个简化的查询使得攻击者能够绕过原有的条件限制:这个查询会返回items表中所有储存的条目,而不管它们的所有者是谁,而原本应该只返回属于当前已认证用户的条目。但是就目前来看,书籍是比较靠谱的入门资料。修改SQL语句之后,程序停止报错,但是却引入了SQL语句拼接的问题,如果没有对用户输入的内容做过滤,势必会产生SQL注入漏洞。

Innocence_0的博客 459

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 275

Hibernate框架中的HQL注入漏洞

 Hibernate是一种ORMapping框架,内部可以使用原生SQL还有HQL语言进行SQL操作。 所谓的HQL注入,就是指在Hibernate中没有对数据进行有效的验证导致恶意数据进入应用程序中造成的。 请看这段代码: Input参数即可造成注入。 不过在Hibernate中,一般都是在createQuery中使用PDO,使用setString填充占位符进行sql语句...

Exploit的小站~ 2万+

实战交易策略 篇二十二:情绪流龙头交易策略

在股票市场中,机构主导趋势,游资驱动热点,散户易被情绪裹挟,形成“金字塔”式生态链,并存在情绪传递、强者恒强、物极必反的规律特点。股市是资金驱动的情绪博弈场,价格波动由群体心理、资金博弈和预期差共同驱动,核心是资本逐利性与人性贪婪恐惧的交织,兼具资源配置、财富再分配与风险定价功能。涨停加速与逃逸缺口(主升强化)凹字板/平台突破(趋势延续)天量弱转强(分歧买点)不参与首波(二波策略)情绪周期(道术合一)主线思维(聚焦核心)开盘抢筹(竞价博弈)一字助攻(情绪强化)分批进出(滚动操作)

生活在别处 1499

ios开发拒绝“玄学”Crash:从循环引用到脏内存,构建你的系统性排查思维模型

你申请了内存,写了数据,这块内存就是脏的。系统无法直接回收它,除非你显式释放,或者系统把它 swap 出去(但在 iOS 上,Compressed Memory 机制虽然能压缩,但不会像桌面系统那样频繁 swap 到磁盘,一旦压缩内存也撑不住,你也得挂)。所以,排查 OOM 的核心心法只有一条:不要问“哪里漏了”,要问“每一刻,留在这个页面上的内存,凭什么必须在这里?一旦内存水位线逼近阈值(不同机型不同,老机器可能 600MB 就危,新机器能抗 1.5GB),系统发个警告。

大模型大数据攻城狮的专栏 724

解决SQL注入(Java)

​​​​​​ JAVASQL INJECTION 0x01 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入的写法 如何避免和修复 SQL 注入 0x02 JDBC 介绍 JDBC: 全称 Java Database Connectivity 是 Java 访问数据库的 API,不依赖于特定数据库 ( database-independent ) 所有 Java 持久层技术都基于 JDBC 更多请参考 htt..

ilqgffvramusm2864的博客 5868

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java代码审计-SQL注入

Java代码审计之SQL注入

qq_44780157的博客 1352

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Mybatis和Hibernate:防止SQL注入

SQL是如何注入的 SQL注入是目前黑客最常用的攻击手段,它的原理是利用数据库对特殊标识符的解析强行从页面向后台传入。改变SQL语句结构,达到扩展权限、创建高等级用户、强行修改用户资料等等操作。 为什么这么说,下面就以JAVA为例进行说明: 假设数据库中存在这样的表: table user( id varchar(20) PRIMARY KEY , n...

琦彦 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

代码审计之SQL注入

MyBatis 是一种将 SQL 语句嵌入到 XML 配置文件中的持久层框架,它通过将 SQL 语句和 Java 代码分离,使 SQL 语句的管理更加直观、易于修改,同时支持 SQL 参数化查询。这一特点可以在一定程度上提高 SQL 安全性,但也可能引入新的安全隐患,特别是在不正确使用#{}和${}占位符的情况下。Hibernate 是一种持久层框架,实现了 Java 持久化 API(JPA)规范,用于在 Java 类和数据库表之间进行映射。

listenJaychou的博客 1310

java-sql注入总结&代码审计实战

我们要先明确,java是强类型语言,实战我想我们也遇到不少尝试sql注入但是遇到java强制类型要求,参数只能是integer类型的java报错,这种是不存在sql注入的,所以只有变量是String类型的时候,才会存在sql注入。

A1353192296的博客 651

Hibernate与MyBatis框架下SQL注入风险深度解析与防御实战

SQL注入作为Web安全领域的经典漏洞,其核心原理在于攻击者通过构造恶意输入,使应用程序将非预期的SQL指令拼接到查询语句中执行。参数化查询是防御SQL注入的根本技术,它通过预编译机制将用户输入严格区分为数据而非代码。在Java企业级开发中,ORM框架如Hibernate和MyBatis极大地提升了数据库操作效率,但若使用不当,其动态查询特性反而会引入注入风险。例如,Hibernate中直接拼接HQL语句,或MyBatis错误使用${}进行字符串替换,都可能导致严重的安全漏洞。本文聚焦于【HQL注入】和【$

weixin_34218579的博客 358

Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)

文章目录注入SQL注入JDBC拼接不当造成SQL注入框架使用不当造成SQL注入不安全的反射命令注入代码注入表达式注入Spel表达式注入OGNL表达式注入模板注入 注入 SQL注入 JDBC拼接不当造成SQL注入 JDBC有两种方法执行SQL语句,分别为PrepareStatement和Statement。两个方法的区别在于PrepareStatement会对SQL语句进行预编译,而Statement方法在每次执行时都需要编译,会增大系统开销。理论上PrepareStatement的效率和安全性会比Stat.

Love&Share 1万+

MyBatis如何防止SQL注入及其与Hibernate的优缺点对比

MyBatis通过#{}和预编译防止SQL注入,适合高性能场景;Hibernate自动化ORM适合快速开发。订单查询系统通过MyBatis优化实现P99延迟40ms、QPS 12万。注入:使用#{}。优化:索引、批量、缓存。监控MyBatis与Hibernate各有优势,未来将在云原生和AI驱动下演进。字数:约5100字(含代码)。如需调整,请告知!MyBatis通过#{}防止注入,适合高性能;Hibernate自动化ORM适合快速开发。订单查询实现P99延迟40ms、QPS 12万。注入#{}。

lssffy的博客 1446

视频教程-JAVA代码审计之SQL注入-代码审计

JAVA代码审计之SQL注入 曾在启明星辰、绿盟科技等大型企业安全公司就职,...

weixin_32937163的博客 319

java代码审计自学:sql注入篇

0x00 前提 主要是因为自己的学习Java 代码审计中的学习思路吧,主要自己一个人学习,有点闭门造车,百度学习法,但是还是记录一下,也分享一下,也便于将来的总结和反思,如果我能终能学到什么,我也会重新梳理思路,为那些自学者提供一个好的思路,所以有了下面的系列文章java代码审计自学篇。 0x01 漏洞原理 虽然基础,但是还是介绍一下吧 SQL 注入老生常谈,就是 SQL 命令插入请求中,并在服务器端被接收后用,没有有效的过滤,导致服务器执行了意料之外的恶意的 SQL 命令,最终达到恶意的脱数据。 Java

god_Zeo的安全博客 753

SQL注入

class文件简介及加载      Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象:    &nbsp...

weixin_45007073的博客 6877

java sql注入包_java代码审计之SQL注入

前言在java中,操作SQL的主要有以下几种方式:•java.sql.Statement•java.sql.PrepareStatment•使用第三方ORM框架,MyBatis或者Hibernatejava.sql.Statementjava.sql.statement是最原始的执行SQL的接口,使用它需要手动拼接SQL语句。String sql = "SELECT * FROM user WHE...

weixin_33508272的博客 399

java代码审计-SQL的注入

Java里面常见的数据库连接方式有三种,分别是JDBC,Mybatis,和Hibernate。Mybatis: $JDBC连接方式下: +、like、order by。

s44359487yad的博客 919

静态代码审计之SQL注入(java)

三种不同框架类型的SQL JDBC--sql注入 Hibernate--sql注入 Mybatis、iBatis-- sql注入 SQL注入手工审计方法 步骤1:全局搜索“+”,找到存在+ 拼接的sql语句,查看参数是否有过滤,一般在DAO层 追溯上层函数,直到,doPost(HttpServletRequest request,HttpServletResponse response) 查看整个流程中,有没有过滤非法字符串,如果没有,则存在sql注入 找到..

一杯咖啡的渗透记忆 1321
上一篇: 【Java代码审计 | 第二篇】SQL注入之JDBC
下一篇: 【Java代码审计 | 第四篇】SQL注入防范
秋说
秋说 优质创作者: 编程框架、信息安全技术领域 优质创作者: 编程框架、信息安全技术领域
博客等级 码龄4年 3万+粉丝 1906原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值