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.参数拼接%后再使用#{}

 

  • 作者:低调做个路人 (扫码联系作者)
  • 发表时间:2021-12-29 18:21:57
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 评论