SQL 注入真是防不胜防!

推荐大家关注一个公众号

点击上方 "编程技术圈"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

日英文

It's true that we don't know what we've got until we lose it, but it's also true that we don't know what we've been missing until it arrives. 

的确只有当我们失去时,才知道曾经拥有的是什么。同样的,只有当我们拥有了才知道从前失去了什么。

每日掏心话

我们都不是很完美的人,但我们要接受不完美的自己。一辈子不长,对自己好点。
责编:乐乐 | 来自:freebuf.com/vuls/240578.html

编程技术圈(ID:study_tech)第 1291次推文

往日回顾:为什么 sin(x²)+sin(y²)=1 的图像这么复杂?

     

   正文   

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把项目下载完成
!small2、搜索$关键字
Ctrl+shift+F 调出Find in Path,筛选后缀xml,搜索$关键字
根据文件名带Dao的xml为我们需要的,以IContentDao.xml为例,双击打开,ctrl +F 搜索$,查找到16个前三个为数据库选择,跳过,
继续往下看到疑似order by 暂时搁置
继续往下看发现多个普通拼接,此点更容易利用,我们以此为例深入,只查找ids从前端哪里传入
搜索公众号Linux中文社区后台回复“命令行”,获取一份惊喜礼包。
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](http://localhost:8080/ms-mcms/mcms/search.do?categoryId=1'))%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层面应该做好参数检查,假定用户输入均为恶意输入,防范潜在的攻击
你还有什么想要补充的吗?
PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师交流群,在后台回复“学习”即可。

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。
别找了,想获取史上最简单的Java大厂面试题学习资料
扫下方二维码回复「面试」就好了


猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
统一处理 try...catch 这么香,求求你不要再满屏写了,再发现扣绩效!

955.WLB 不加班公司名单(持续更新)

MySQL 大批量插入,如何过滤掉重复数据?

嘿,你在看吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值