SQL Injection - Mybatis
SQLI(SQL Injection) SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句。
运行
漏洞代码 - order by 注入
/** * 使用 #{} 会将对象转成字符串,形成 order by "user" desc 造成错误,因此很多研发会采用${}来解决,从而造成SQL注入 */ @RequestMapping("/mybatis/vul/order") public List
orderBy(String field, String sort) { return userMapper.orderBy(field, sort); } // mapper.xml语句
select * from users order by ${field} ${sort}
运行
安全代码 - 强制类型
@RequestMapping("/mybatis/safe/id/{id}") public List
queryById(@PathVariable Integer id) { return userMapper.queryById2(id); } // 使用 ${} 存在注入,但强制使用Integer导致注入无效 @Select("select * from users where id = ${id}") List
queryById2(@Param("id") Integer id);
编码建议
【必须】SQL语句默认使用预编译并绑定变量 使用Mybatis作为持久层框架,应通过#{}语法进行参数绑定,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数。 针对order by 注入可以在java层面做映射来进行解决。
运行
安全代码 - 排序映射
select * from users
order by id desc
order by user desc
order by id desc