这样使用MyBatis框架,被攻击了

简介: 这样使用MyBatis框架,被攻击了

前言

 

SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少。新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手,希望通过Mybatis框架使用不当导致的SQL注入问题为例,能够抛砖引玉给新手一些思路。

 

一、Mybatis的SQL注入

 

Mybatis的SQL语句可以基于注解的方式写在类方法上面,更多的是以xml的方式写到xml文件。Mybatis中SQL语句需要我们自己手动编写或者用generator自动生成。编写xml文件时,MyBatis支持两种参数符号,一种是#,另一种是$。比如:

 

<select id="queryAll"  resultMap="resultMap">
  SELECT * FROM NEWS WHERE ID = #{id}
</select>

 

#使用预编译,$使用拼接SQL。

 

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

 

1、模糊查询

 

Select * from news where title like ‘%#{title}%’br

 

2、in 之后的多个参数

 

in之后多个id查询时使用# 同样会报错,

 

Select * from news where id in (#{ids})br

 

正确用法为使用foreach,而不是将#替换为$

 

id in

 

<foreach collection="ids" item="item" open="("separatosr="," close=")">
#{ids} 
</foreach>

 

3、order by 之后

 

这种场景应当在Java层面做映射,设置一个字段/表名数组,仅允许用户传入索引值。这样保证传入的字段或者表名都在白名单里面。需要注意的是在mybatis-generator自动生成的SQL语句中,order by使用的也是$,而like和in没有问题。

 

二、实战思路

 

我们使用一个开源的cms来分析,java sql注入问题适合使用反推,先搜索xml查找可能存在注入的漏洞点-->反推到DAO-->再到实现类-->再通过调用链找到前台URL,找到利用点,话不多说走起。

 

1、idea导入项目

 

Idea首页 点击Get from Version Control,输入https://gitee.com/mingSoft/MCMS.git 下载完成,等待maven把项目下载完成

 

 

2、搜索$关键字

 

Ctrl+shift+F 调出Find in Path,筛选后缀xml,搜索

 

 

,查找到16个前三个为数据库选择,跳过,

 

 

继续往下看到疑似order by 暂时搁置

 

 

继续往下看发现多个普通拼接,此点更容易利用,我们以此为例深入,只查找ids从前端哪里传入

 

 

 

 

3、搜索映射对象Mybatis 的select id对应要映射的对象名,我们以getSearchCount为关键字搜索映射的对象

 

 

搜到了IContentDao.java,IContentDaoimpl.java和McmsAction.java,分别对应映射的对象,对象的实现类和前端controler,直接跳转到controler类

 

 

发现只有categoryIds与目标参数ids相似,需进一步确认,返回到IContentDao.java按照标准流继续反推

 

 

找到ids为getSearchCount的最后一个参数,alt+f7查看调用链

 

 

调转到ContentBizImpl,确认前台参数为categoryIds

 

 

返回到McmsAction,参数由BasicUtil.getString接收,

 

 

跟进BasicUtil.getString

 

 

继续跳到SpringUtil.getRequest(),前端未做处理,sql注入实锤

 

 

4、漏洞确认项目运行起来,构造sql语句http://localhost:8080/ms-mcms/mcms/search.do?categoryId=1%27)%20%20or+updatexml(1,concat(0x7e,(SELECT+%40%40version),0x7e),1)%23 得到mysql的版本5.7.27,验证注入存在。

 

 

三、总结

 

以上就是mybatis的sql注入审计的基本方法,我们没有分析的几个点也有问题,新手可以尝试分析一下不同的注入点来实操一遍,相信会有更多的收获。当我们再遇到类似问题时可以考虑:

 

1、Mybatis框架下审计SQL注入,重点关注在三个方面like,in和order by

 

2、xml方式编写sql时,可以先筛选xml文件搜索$,逐个分析,要特别注意mybatis-generator的order by注入

 

3、Mybatis注解编写sql时方法类似

 

4、java层面应该做好参数检查,假定用户输入均为恶意输入,防范潜在的攻击

相关文章
|
21天前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
33 1
持久层框架MyBatisPlus
|
2月前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
35 0
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
Java 数据库连接 mybatis
mybatis框架图
文章介绍了MyBatis框架的起源、发展和其作为持久层框架的功能,提供了MyBatis的框架图以帮助理解其结构和组件。
mybatis框架图
|
4月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
4月前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
4月前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
40 0
|
4月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
359 0
|
4月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
4月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。