【JAVA代码审计】从零开始的Mybatis框架SQL注入审计(上)

2022-11-11 15:35:18 浏览数 (1)

hello,各位小伙伴大家好~

这里是小编Monster~

今天继续分享JAVA代码审计相关内容:

(1)JDBC下的SQL注入审计(已完结)

(2)Mybatis下的SQL注入审计

(3)Hibernate下的SQL注入审计

上期分享了JDBC下的注入审计,今天开始分享mybatis框架下的SQL注入审计。

由于内容较多,本次分享分为上下两期,本期先来看看Mybatis环境搭建和路由讲解吧~

Part.1

SSM框架概述

Mybatis概述

MyBatis是一个优秀的持久层框架,它的作用和上期的JDBC一样,用于网站与数据库之间的连接和访问。

它对JDBC操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

因此它的底层也是jdbc,是对jdbc的封装,最终也是生成jdbc代码访问数据库。

Mybatis一般是放在框架组合中使用的,数据库常见的框架组合包括SSM和SSH组合,即:

因此,学习Mybatis我们就需要知道SSM框架是怎么运作的。

本次从零开始系列分享依然是从环境搭建开始,我们先来搭建一个使用SSM框架的线上教育系统,再通过这个系统来具体学习。

Part.2

SSM环境搭建

Idea项目导入

首先通过idea创建一个新项目,并打开我们下载好的cms:

此时会弹出提示窗,因为我们通过Maven创建项目,所以选择Maven project:

打开项目可能会发现源码文件加载不出来,这种情况只需要删除源码中的.idea文件夹即可:

删除.idea文件后,重新打开项目,即可加载出源文件,如下图:

项目加载成功后,我们还需要配置运行环境,使项目运作起来,首先将JDK修改为1.8(或1.7)版本:

因为是Maven项目,修改Maven配置,选择我们本机的Maven工具地址:

接下来,还需要配置一下tomcat环境来运行这套代码,选择local通过本地调试方式进行搭建:

//选择tomcat版本,我本机安装的是8.5.31;

注意:如果端口8080和本机其他服务冲突,这里可修改为其他端口运行:

最后添加运行环境,点击Fix并选择inxedu.war即可:

数据库相关配置

运行环境配置完毕后,还需要连接本地数据库,找到project.properties文件,修改jdbc.host为本机(即数据库)ip地址,这里设置为环回口地址;

然后将jdbc.username、password修改为本机数据库的用户名、口令即可。

注意:上图还需要将项目路径(contextpath)改为和tomcat中的url一致,即下图的url:

最后连接本地数据库,可以使用DBeaver或navicat:

连接成功后,导入cms文件包中的sql脚本:

执行后,成功创建我们需要的数据库:

运行项目

最后,返回idea,通过tomcat运行cms:

项目运行成功,浏览器自动访问首页:

环境搭建完毕~

Part.3

SSM路由分析

框架判断

在代码审计之前,我们需要先判断一下该cms使用什么框架进行运作。

首先查看web.xml文件,可以看到加载了Spring核心配置文件applicationContext.xml:

可以在资源目录中找到applicationContext.xml文件:

同时,web.xml文件还加载了Spring-mvc的配置文件spring-mvc.xml:

spring-mvc.xml配置如下:

查看spring核心配置文件applicationContext.xml,发现通过Spring整合Mybatis配置:

找到Mybatis配置文件SqlMapConfig.xml:

因此判断该cms通过ssm框架搭建,即Spring Spring-mvc Mybatis。

路由分析

判断为SSM框架后,来分析一下路由。

首先和JDBC一样,需要创建实体pojo类,类中的各个参数与数据库中目标表的列名需要一一对应,包括参数名、参数类型。

//在entity目录中可以找到这些类。

如果不一致,应该是在mapper文件中配置了别名,别名则和数据库一致:

//mapper文件则是mybatis记录数据库相关语句的地方,后面会讲到。

通过动态代理的方式,Mybatis将Dao层接口直接作为数据库映射文件。

//可以直接理解为:将各种数据库操作方法记录在Dao接口中,因此我们控制数据库,直接调用dao接口中具体的方法即可。

但是可以发现,上图只是创建了方法,但方法没有写具体的操作内容,那么真正的SQL语句在哪里呢?答案是在mapper文件中。

Mapper文件,与Dao层文件一一对应,记录Dao文件中各方法相应的SQL语句:

//文件名也是对应的,xxxDao对应xxxMapper

mapper文件格式说明如下:

回到我们的源码,可以看到mapper中的sql语句,确实和dao层文件一一对应:

因此,当我们确定mapper中一条sql语句存在注入后,就可以直接去找对应的dao层相关类,并找到对应的相关方法,再往上追溯那些地方调用了这个类的相关方法即可。

此外,SSM框架通过Spring-MVC控制器(Controller)确定访问url:

例如上图,想要访问Teacher的getTeacherById查询方法对应的url为:

http://127.0.0.1/front/teacher/{teacherId}

综上,当我们输入url访问SSM框架服务时,服务端先根据url找到对应的Controller类中的方法;再根据方法中调用的具体对象与方法,一步步追溯到dao层,再根据dao层找到mapper文件 ,最终就能确定执行的sql语句的具体内容。

如果没能理解也不用急,下期将通过本cms具体漏洞挖掘案例,带大家一起过一遍这个路由流程。

Part.4

结语

以上就是今天的全部内容了~

0 人点赞