精选文章 Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!

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

作者:l_瓶中精灵 时间: 2020-08-05 12:00:00
l_瓶中精灵 2020-08-05 12:00:00

点击上方“阿拉奇学Java”,选择“置顶或者星标

 每天早晨0000分,与你相约!

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!1

往日回顾:贼好用的Java工具类库,GitHub星标13k+,很是厉害!

前言

SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少。

新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手,希望通过Mybatis框架使用不当导致的SQL注入问题为例,能够抛砖引玉给新手一些思路。

一、Mybatis的SQL注入

Mybatis的SQL语句可以基于注解的方式写在类方法上面,更多的是以xml的方式写到xml文件。

Mybatis中SQL语句需要我们自己手动编写或者用generator自动生成。编写xml文件时,Mybatis支持两种参数符号,一种是#,另一种是$。比如:

  SELECT * FROM NEWS WHERE ID = #{id}

使用预编译,$使用拼接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#{ids} 

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把项目下载完成

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!2

2、搜索$关键字

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

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

根据文件名带Dao的xml为我们需要的,以IContentDao.xml为例,双击打开,ctrl +F 搜索$,查找到16个前三个为数据库选择,跳过,

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!4

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!5

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!6

3、搜索映射对象

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!7

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!8

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!9

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!10

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!11

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!12

跟进BasicUtil.getString

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!13

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

Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!14

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 注入攻击的 3 种方式,真是防不胜防!15

三、总结

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

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

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

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

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

学习了不?在看分享下给身边的人吧!

本文授权转载请注明来自FreeBuf.COM

链接:https://urlify.cn/MNNV3

回复「进群」即可进入无广告技术交流群。同时送上250本电子书+学习视频作为见面 

有你想看的精彩 


因提供免费观看VIP视频、免广服务,开发者被判赔86.5万元
高中生写LOL外挂1年狂赚500万,落网前刚买下120万保时捷...
超全!最新互联网大厂的薪资和职级一览
35岁程序员被裁后找了6份兼职,晒出收入网友:“打工皇帝”
有理有据:一篇来自前端同学对后端接口的吐槽!
一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)
我在谷歌,女友在亚马逊,晒出2人总收入,网友:好酸
裂墙推荐!国产Java代码补全神器,aiXcoder 2.0实测
目前5000+ 人已关注加入我们

       
       

好文章,我在看❤️
勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:历时两周,将我司的Hadoop2升级到Hadoop3,踩了几个大坑...

下一篇:历时两周,将我司的Hadoop2升级到Hadoop3,踩了几个大坑...

您可能感兴趣

  • 收藏!NLP在金融投资领域的应用

    标星★置顶公众号 爱你们♥ 作者:泰极 | 华泰证券数字科技 1 引言 2017年被称为中国金融科技的元年,这两年来,以人工智能为代表的新技术对金融业产生越来越重要的影响,人工智能不是一个新名词,在历史的长河里,它从人们曾忘却的暗流慢慢汇聚成今天的大江大河。自然语言处理作为人工智能的支流,也随着它的发展浪潮逐渐展现它的潜能。这次浪潮如此之大,让全球的金融行业都感受到它的湿意,虽然人工智能不能...

  • php面试题整理

    一 、PHP基础部分 1、PHP语言的一大优势是跨平台,什么是跨平台? PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台 2、WEB开发中数据提交方式有几种?有什么区别?百度使用哪种方式? Get与post两种方式 区别: (1)url可见性:get 方式url参数可见,pos...

  • 阿里新版java开发手册(2019华山版、2020泰山版)

    pdf文件链接: https://pan.baidu.com/s/15Q_qCyqLTG0wBFyHVM3zog 提取码: in6y 目录 一、 编程规约 (一) 命名风格 (二) 常量定义 (三) 代码格式 (四) OOP 规约 (五) 集合处理 (六) 并发处理 (七) 控制语句 (八) 注释规约 (九) 其它 二、异常日志 (一) 异常处理 (二) 日志规约 三、单元测试 四、安全规约...

  • 知识专栏汇总

    得到 一、【订阅专栏】 01 雪枫音乐会 02 五分钟商学院·第一季 03 前哨·第一季 04 硅谷来信·第一季 05 李翔商业内参 06 伯凡日知录 07 槽边往事 08 超级个体 09 樊登速读 10 关系攻略 11 卓老板聊科技 12 郝广才·今天 13 博雅小学堂 14 老浦识字 15 通往财富自由之路 16 薛兆丰的北大经济学课 17 精英日课·第一季 18 Dr.魏的家庭教育宝典...

  • 面试刷题11-12

    背景 在老东家五年了,总共工作整七年,经历两家公司。2019-10-31日离职。公司规模较小,项目压力不大,非985/211毕业,统招本科,计算机专业。目标:中大型公司,最好是大厂,嘿嘿,不过不抱希望,毕竟背景不太好。 准备 撰写简历,每天下班回家 7-12点看视频,刷博客,看面试题。 学习内容:JavaGuide,《某某时间》系列专题,《某某课堂》学习视频。 准备内容:Java 基础,集合...

  • 超全面深入计算机网络知识 ==》解决面试网络问题

    记录下计算机网络的常见题目,以及HTTP的一系列知识和问题,方便巩固知识和回顾~~~ 目录 1. TCP/IP协议分层管理? TCP/IP协议的分层管理: ==> TCP 与 UDP的区别: osi七层模型 2. 三次握手四次挥手机制及其原因? 三次握手过程理解: 四次挥手过程理解: 3. HTTP的常用方法? 4. GET 和 POST的区别? 5. HTTP建立持久连接的意义? (1)、...

  • 使用eclipse开发Java Web项目 【配置】

    1. Servlet Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要: 接收请求数据; 处理请求; 完成响应。 例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理。Servlet需要我们自己...

  • 软件测试面试题(汇总)

    软件测试 面试题汇总 测试技术面试题 1、什么是兼容性测试?兼容性测试侧重哪些方面?.................................................................................... 5 2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 5 3、测试的策略有哪些?.......

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。