Mybatis中SQL注入攻击的3种方式,真是防不胜防!

作者 | sunnyf

来源 | https://www.freebuf.com/vuls/240578.html

前言

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}%’

在这种情况下使用#程序会报错,新手程序员就把#号改成了$,这样如果java代码层面没有对用户输入的内容做处理势必会产生SQL注入漏洞。

正确写法:

select * from news where tile like concat(‘%’,#{title}, ‘%’)

2、in 之后的多个参数

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

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

正确用法为使用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,搜索$关键字

根据文件名带Dao的xml为我们需要的,以IContentDao.xml为例,双击打开,ctrl +F 搜索$,查找到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层面应该做好参数检查,假定用户输入均为恶意输入,防范潜在的攻击

往期推荐厉害了,Spring中bean的12种定义方法!
SpringBoot 中的 3 种条件装配!
@Autowired报错的4种解决方案和原因分析!

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

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

相关文章

Hadoop源代码分析(MapReduce概论)

大家都熟悉文件系统&#xff0c;在对HDFS进行分析前&#xff0c;我们并没有花很多的时间去介绍HDFS的背景&#xff0c;毕竟大家对文件系统的还是有一定的理解的&#xff0c;而且也有很好的文档。在分析Hadoop的MapReduce部分前&#xff0c;我们还是先了解系统是如何工作的&…

Java CharArrayWriter size()方法与示例

CharArrayWriter类的size()方法 (CharArrayWriter Class size() method) size() method is available in java.io package. size()方法在java.io包中可用。 size() method is used to get the current size of this buffer (CharArrayWriter). size()方法用于获取此缓冲区的当前…

C# Winform 窗体美化(四、镂空窗体)

四、镂空窗体 例子下载 如果没有积分&#xff0c;可以关注公众号找一下【大鱼code】 直接贴效果图吧&#xff1a; 1、控件的透明 [外链图片转存中…(img-d0Kky9yO-1655564321951)] 2、窗体的透明 [外链图片转存中…(img-zF1WTwWl-1655564321952)] 代码如下&#xff1a; p…

再有人问你MySql的隔离级别,直接把这篇文章发给他!

作者 l zyz1992来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;首先要明白什么是事务&#xff1f;事务是程序中一系列严密的操作&#xff0c;所有的操作必须完成&#xff0c;否则在所有的操作中所做的所有的更改都会被撤销。也就是事务的原子性&#xff0c;一…

Spring与Hibernate两种组合方式

Spring与Hibernate大致有两种组合方式&#xff0c;主要区别是一种是在Hibernate中的hibernate.cfg.xml中配置数据源&#xff0c;一种是借助Spring的jdbc方式在Spring的applicationContext.xml文件中配置数据源,然后在Spring配置sessionFactory的bean有些区别 下面大致的说明一下…

Java CharArrayReader mark()方法与示例

CharArrayReader类mark()方法 (CharArrayReader Class mark() method) mark() method is available in java.io package. mark()方法在java.io包中可用。 mark() method is used to mark the current position in the stream and whenever the call to reset() method so it re…

C# Winform 窗体美化(五、鼠标穿透)

五、鼠标穿透 以前在玩射击游戏的时候&#xff0c;狙击枪的设定一般是开镜才有准星&#xff0c;所以想是不是可以自己造一个默认准星出来&#xff0c;思路是现在窗口上画一个准星&#xff0c;然后把窗体其他区域都透明&#xff0c;然后设置鼠标穿透&#xff1b; 结果是&#…

生产环境一次诡异的NPE问题,反转了4次

前言公司为了保证系统的稳定性&#xff0c;加了很多监控&#xff0c;比如&#xff1a;接口响应时间、cpu使用率、内存使用率、错误日志等等。如果系统出现异常情况&#xff0c;会邮件通知相关人员&#xff0c;以便于大家能在第一时间解决隐藏的系统问题。此外&#xff0c;我们这…

ZooKeeper学习笔记—配置管理

为什么80%的码农都做不了架构师&#xff1f;>>> 最近在工作中&#xff0c;为了完善公司集群服务的架构&#xff0c;提高可用性&#xff0c;降低运维成本&#xff0c;因此开始学习ZooKeeper。 至于什么是ZooKeeper&#xff1f;它能做什么&#xff1f;如何安装ZooKee…

Java BigDecimal compareTo()方法与示例

BigDecimal类compareTo()方法 (BigDecimal Class compareTo() method) compareTo() method is available in java.math package. compareTo()方法在java.math包中可用。 compareTo() method is used to compare this BigDecimal object to the given object or in other words …

C# Winform 窗体美化(六、双层窗体)

六、双层窗体 大概情况 双层床体是为了平滑的创建异形窗体的一个解决方案&#xff0c;找了很多资料&#xff0c;整理了一下。 双层窗体的逻辑是建立在 UpdateLayeredWindow 不能绘制控件的基础上&#xff0c;上层再添加一个专门放置控件的层&#xff1b;这样就可以在上层“控…

批处理框架 Spring Batch 这么强,你会用吗?

来源&#xff1a;blog.csdn.net/topdeveloperr/article/details/84337956spring batch简介Spring Batch架构介绍Spring Batch核心概念介绍chunk 处理流程批处理操作指南spring batch简介 spring batch是spring提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在…

Android Bundle类别

即使在今天发现自己Bundle类不明确&#xff0c;因此&#xff0c;花时间去研究了一下。 依据google官方文件&#xff08;http://developer.android.com/reference/android/os/Bundle.html&#xff09; Bundle类是一个key-value对&#xff0c;“A mapping from String values to …

C# Winform 窗体美化(七、Win7 Aero 毛玻璃效果)

七、Win7 Aero 毛玻璃效果 在 Win7 上有一种 Aero 效果&#xff0c;毛玻璃透明效果&#xff0c;搭配不同风格的颜色&#xff0c;效果很好。在学习 Winform 美化的时候顺便看到的这种效果&#xff0c;也整理进来了。 注意&#xff1a;Win7 上想看到这种效果需要开启并使用 Aer…

非导向传输媒体| 计算机网络

Transmission media can be categorized in two ways, 传输媒体可以通过两种方式进行分类&#xff1a; Guided Transmission Media 引导传输媒体 Unguided Transmission Media 非引导传输媒体 1)非引导传输媒体 (1) Unguided Transmission Media) It is also called wireless …

面霸篇:MQ 的 5 大关键问题详解

最近mq越来越火&#xff0c;很多公司在用&#xff0c;很多人在用&#xff0c;其重要性不言而喻。但是如果我让你回答下面的这些问题&#xff1a;我们为什么要用mq&#xff1f;引入mq会多哪些问题&#xff1f;如何解决这些问题&#xff1f;你心中是否有答案了呢&#xff1f;本文…

C# Winform 窗体美化(八、Icon)

八、Icon 之前 Winform 项目也有在 Icon 上遇到些问题&#xff08;这里的 Icon 指的是 .ico 类型的文件&#xff09;&#xff0c;比如刚开始不知道怎么让自己的程序 Icon 和其他软件一样可以放大&#xff0c;还有放大之后在音量合成器中会出现比较奇葩的效果之类的问题&#x…

Java LocalDate类| 带示例的getEra()方法

LocalDate类的getEra()方法 (LocalDate Class getEra() method) getEra() method is available in java.time package. getEra()方法在java.time包中可用。 getEra() method is used to get the era applicable for this LocalDate object. getEra()方法用于获取适用于此LocalD…

MyBatis 的执行流程,学废了!

作者&#xff1a;双子孤狼来源&#xff1a;blog.csdn.net/zwx900102/article/details/108455514MyBatis可能很多人都一直在用&#xff0c;但是MyBatis的SQL执行流程可能并不是所有人都清楚了&#xff0c;那么既然进来了&#xff0c;通读本文你将收获如下&#xff1a;1、Mapper接…

C# Winform 窗体美化(九、嵌入窗体)

九、嵌入窗体 还是关于 Winform 窗体的一些操作问题&#xff0c;这次是研究了一个嵌入窗体&#xff0c;这次学习纯属偶然&#xff0c;项目中确实没遇到过这种需求。就是把别人的程序嵌入到自己的程序中&#xff0c;就像这样&#xff1a; 这里我嵌入了测试显示器的程序 [外链图…