点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

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

链接: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层面应该做好参数检查,假定用户输入均为恶意输入,防范潜在的攻击

热门内容:因用了Insert into select语句,美女同事被开除了!
我们已经不用AOP做操作日志了!Spring Boot+JWT+Shiro+MyBatisPlus 实现 RESTful 快速开发后端脚手架
MyBatis动态SQL(认真看看, 以后写SQL就爽多了)最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

MyBatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!相关推荐

  1. java mybatis狂神说sql_Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!

    前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少. 新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手 ...

  2. Mybatis框架下SQL注入审计分析

    前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少.新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手, ...

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

    作者 | sunnyf 来源 | https://www.freebuf.com/vuls/240578.html 前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种O ...

  4. SQL注入攻击讲解及PHP防止SQL注入攻击的几种方法

    毕业开始从事winform到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发--必须的各种借口.这几天把sql注入的相关知识整理了下,希望 ...

  5. java mybatis狂神说sql_Mybatis框架下SQL注入审计分析

    前言 SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少.新手代码审计者往往对Java Web应用的多个框架组合而心生畏惧,不知如何下手, ...

  6. 解决eclipse中Mybatis框架下sql语句执行后控制台不显示日志问题

    eclipse执行完sql语句成功后,控制台什么都不打印,如图 解决方法:在mybatis-config.xml配置文件中,加入<setting name="logImpl" ...

  7. 为什么preparedstatement能防止sql注入_使用Python防止SQL注入攻击的实现示例

    文章背景 每隔几年,开放式Web应用程序安全项目就会对最关键的Web应用程序安全风险进行排名.自第一次报告以来,注入风险高居其位!在所有注入类型中,SQL注入是最常见的攻击手段之一,而且是最危险的.由 ...

  8. [转载] 使用Python防止SQL注入攻击

    参考链接: 使用Python的SQL 1 文章目录 文章背景1. 了解Python SQL注入2. 设置数据库2.1 创建数据库2.2 构造数据创建表2.3 设置Python虚拟环境2.4 使用Pyt ...

  9. 如何防止SQL注入攻击?

    SQL注入是一种注入攻击,可以执行恶意SQL语句.下面本篇文章就来带大家了解一下SQL注入,简单介绍一下防止SQL注入攻击的方法,希望对大家有所帮助. 什么是SQL注入? SQL注入(SQLi)是一种 ...

最新文章

  1. 随机森林RF中的特征重要性的计算公式VIM
  2. golang 判断目录是否为空
  3. Jlink接口的Jtag和SWD接口定义
  4. shp2sde命令行方式向arcsde批量导入数据脚本的生成步骤
  5. 使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试
  6. 自制简单的小型Linux,自制小型Linux系统
  7. STM32建好的工程为啥下载不进去程序
  8. java中a 和 a_Java中a=a++ 和 a=++a(轉)
  9. POJ 1192 最优连通子集(树形DP)
  10. hdu 3879 Base Station
  11. php支付接口要改动的参数,php支付接口_php支付宝支付接口程序及参数详解
  12. Win10 企业版 2016长期服务版 激活
  13. 关于电解电容ESR的问题
  14. 【JAVA】根据汉字拼音首字母排序 不同类型处理
  15. win的反义词_全新整理小学英语常见的120对反义词大全,快来收藏学习吧
  16. Python监控股价并通过微信提醒
  17. 玻璃幕墙LED透明屏多少钱一平方?为你解答
  18. tkinter窗口美化功能介绍 第一章 内部美化功能
  19. bitmap 转换nv21
  20. 格灵深瞳mysql面试三表联查

热门文章

  1. Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)...
  2. RegExp 正则
  3. case when then else end
  4. Hadoop学习笔记之三 数据流向
  5. android 带边框的圆角按钮
  6. Linux sendmail发送邮件失败诊断案例(一)
  7. 秦州:西瓜书 + 南瓜书 吃瓜系列 13. 降维与度量学习(上)
  8. 姜子上:利用BiLSTM-CRF进行命名实体识别
  9. 【怎样写代码】函数式编程 -- Lambda表达式(三):LINQ初步
  10. Pandas 数据类型概述与转换实战