前言Mybatis注入是一种常见的安全漏洞,本文将介绍Mybatis注入的四种方式,并提供相应的安全防范方法。测试环境
测试环境使用以下配置:
Mysql:5.7
Springboot:2.1
Mybatis:3.5
数据库
在Mybatis数据库中创建了一个测试用的表"users",结构如下:
CREATE TABLE `users` ( `uid` int(10) NOT NULL AUTO_INCREMENT, `uname` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL, `uage` int(10) NULL DEFAULT NULL, PRIMARY KEY (`uid`) USING BTREE ) ENGINE = MyISAM AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic; INSERT INTO `users` VALUES (1, 'Sentiment', 20); INSERT INTO `users` VALUES (2, 'Shelter', 20); INSERT INTO `users` VALUES (3, 'Tana', 18);
SQL注入的四种方式
#{}和${}
接口
java
List selectOne(@Param("uname") String uname);
配置
xml
测试
java
@GetMapping("/inject/1") @ResponseBody public List selectOne(@RequestParam("uname") String uname) { return userService.selectOne(uname); }
在这种方式中,执行语句是 select * from users where uname = '${uname}',可以直接使用单引号闭合进行注入。例如,使用万能密码1' or '1'='1进行测试:
bash
http://127.0.0.1:8080/inject/1?uname=1' or '1'='1
安全防范
将 ${} 替换为 #{} ,使用预编译的方式可以有效避免SQL注入问题。
模糊查询
模糊查询中有三种方式,分别是:
select * from t_user where username like '%${mohu}%' select * from t_user where username like "%"#{mohu}"%" select * from t_user where username like concat('%',#{mohu},'%')
在第二种方式中,"%"#{mohu}"%"预编译前后的%是独立的,写成'%#{mohu}%'的形式会导致预编译时将 % 视为字符处理,从而导致报错。而如果不够经验,将 #改为$,如 '%${mohu}%' ,就会导致SQL注入问题。
In查询
当查询语句使用了in操作符时,只需要对in后面的内容进行闭合,即可绕过安全检查。
配置
xml
测试
例如,使用以下注入语句进行测试:
css
http://127.0.0.1:8080/inject/3?uid=1) or updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
安全防范
为了防止In查询的注入问题,建议使用预编译方式,并严格验证和过滤传入的参数。
order by注入
order by注入的原理与In查询基本相同。
配置
xml
测试
例如,使用以下注入语句进行测试:
css
http://127.0.0.1:8080/inject/4?uid=1 and(updatexml(1,concat(0x7e,(select database())),0));
安全防范
为了防止order by注入问题,同样建议使用预编译方式,并对传入的参数进行严格验证和过滤。文章来源:https://www.toymoban.com/news/detail-441677.html
综上所述,为了避免Mybatis注入问题,最好的方式是使用预编译方式,即将${}替换为#{},并对传入的参数进行验证和过滤。文章来源地址https://www.toymoban.com/news/detail-441677.html
到了这里,关于Mybatis注入漏洞及防范方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!