
Mybatis下的SQL注入
在xml文件中,Mybatis支持两种占位符号,分别是#和$。
#符在like、in、order by这些SQL语句中使用不规范就会报错,一些初级开发者就会使用$符替换#符从而造成了SQL注入。
1、in语句中的SQL注入
in之后多个查询时使用#会报错,例如:
Select * from news where ids in (#{ids})
而将#替换为$就不会报错:
Select * from news where ids in (${ids})
正确用法为在XML文件中使用foreach,而不是将#替换为$,如下图所示:
2、like语句中的SQL注入
like模糊查询直接使用#也会报错,例如:
Select * from news where title like '%#{name}%'
直接把#号改成了$,如果在代码中没有对用户输入的内容做处理就会产生SQL注入漏洞。
Select * from news where title like '%${name}%'
正确的做法是使用concat函数:
select * from news where tile like concat(‘%’,#{name}, ‘%’)
3、order by语句中的SQL注入
在mapper文件中如果使用order by #{Name}会导致最后sql语句参数多加引号,会产生报错,例如:
select * from test order by 'Name'
order by后面可以使用$,例如:order by ${Name}
但是这会导致潜在的SQL注入攻击,因此需要对传入的参数进行转义并检查。
以tmall项目为例,项目地址:
https://gitee.com/project_team/Tmall_demo.git
在项目中搜索${
以ProductMapper.xml文件为例,进行逆向追踪,定位到88行,向上查看根据select id追踪该dao层的代码文件(如果在IDEA中安装插件Free Mybatis plugin击左侧绿色箭头可以快速跳转)。
跳转到dao层代码文件,可以看到17行代码中select函数中存在orderUitl参数,继续逆向追踪,键盘按住ctrl键后鼠标左击select,查看使用select函数的代码,如下图所示:
点击ProductServiceImpl.java文件,定位到37行。如下图所示:
getList方法中使用到了orderUtil参数,继续逆向追踪,键盘按住ctrl键后鼠标左击getList,如下图所示:
可以看到ProductController.java使用了该方法,在第405行中传入orderUtil值,进入Controller层查看具体代码,如下图所示:
OrderUitl工具类代码如图所示:
该类需要两个参数即orderyBy和isDesc,从admin/product/{index}/{count}接口获取并且没有做任何过滤。
搭建好项目后再web界面中找到该接口。
进行初步判断:
orderyBy=1,返回正常:
orderyBy=99,报错:
使用sqlmap:python sqlmap.py -r 1.txt
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)