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
结语
以上就是今天的全部内容了~