Mybatis使用模糊查询导致SQL注入问题排查
Mybatis #{}和${}
我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,
一般能用#的就别用$
${}SQL注入复现
实际开发时有时需要用like做模糊匹配,我这里图省事直接用 ${}拼接 如图:

下面我们测试下SQL注入场景,这个sql执行是通过前端搜索框触发的,我们本地启服务打个断点:

2021-12-29 18:31:57.870 DEBUG 9668 --- [io-8081-exec-29] c.p.m.BlogMapper.findIndexPage_COUNT : ==> Preparing: select count(0) from (select bl_id,title,outline,background_image,recommend,commentabled,published,views,ty_id,create_time,update_time from t_blog where published=true AND title like "%canal%" order by create_time desc) tmp_count
看控制台输出的SQL因为用到了 PageHelper分页 会先执行一个 count() 语句,现在我们把参数改下:

再看数据库:

Person表被创建了,SQL注入成功
因为是GET请求,我们将
%a")tmp_count;CREATE TABLE Persons ( Id_P int, LastName varchar(255));--
做URL编码后如下:
%25a%22)tmp_count%3BCREATE%20TABLE%20Persons%20(%20Id_P%20int%2C%20LastName%20varchar(255))%3B--

我们删除Person表,将上面语句直接放到页面输入,查看执行结果,Person表又被创建了,SQL注入成功
解决方案
1.使用#{}配合mysql的concat函数
2.参数拼接%后再使用#{}
0 条评论
想要飞的小乌龟
Java软件开发
- 从业日期: 2022/08/04
- 性别: 男
口头禅
每天搬一点,幸福多一点
40
发帖数
59
源码数
0
接单
8
获赞
23
获评
{{commentItem.nickName}}
{{formatIntervalTime(commentItem.createTime)}}{{childComment.nickName}} {{childComment.replyNickName}}
{{formatIntervalTime(childComment.createTime)}}