这是我在思考调试sql注入出现的小bug
打印出来的SQL语句放在数据库执行
select id,name,age,phone from yu_student where phone = '123' or 1=1
运行结果
sql语句没有问题,为什么java程序会报错呢
错误内容是druid的sql防火墙报警,发现是hibernate自动拼接了1=1的永真条件,而druid只会放行排在第一的永真条件
查看hibernate源代码后发现,当引用Junction生成sql时,如果条件为空,则会自动拼接1=1的永真条件。
解决办法也很简单,修改自己的代码,将引用junction的条件拼接放在第一位即可。
代码如图所示
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
String abc = "1=1 or "+"'123'";
String ad = "'123'"+" or 1=1";
System.out.println(studentMapper.getOne1(abc));
//System.out.println(studentMapper.getOne1(ad));
}
一开始我们执行的是System.out.println(studentMapper.getOne1(ad));
现在我们执行 System.out.println(studentMapper.getOne1(abc));
相关代码
xml文件
<select id="getOne1" resultMap="BaseResultMap">
select id,name,age,phone from yu_student
where phone = ${phone}
</select>
mapper接口
List<Student> getOne1(@Param(value = "phone") String phone);
为何会出现SQL注入 原因以及解决方案请看我相关文章