Loading

Java Web开发中的SQL注入风险

0x01 MyBatis XML映射器使用不当

Spring+Mybatis组件的开发方式是目前最常见的Java Web开发技术栈,在该技术栈中会在XML映射文件中编写SQL语句,通过#$符号标注动态参数位置,而MyBatis会在运行的过程中通过预编译绑定参数以实现查询
在XML中编写SQL语句存在一些场景容易出现SQL注入,根本原因是使用${}拼接符,MyBatis在解析该符号时,会直接拼接变量,导致攻击者可以输入恶意内容污染原有SQL语句。这部分的内容也是目前网上提到的最多的。

  1. 在where等语句中,误用${},应当使用#{}。
  2. 在模糊查询中,由于使用like #{}存在编译错误,导致误用${},应当使用concat('%',#{input}, '%')解决。
  3. 在in查询中,由于#{ids}编译错误,误用${},应当使用foreach解决。
  4. 在order by中,由于${id}编译错误,误用${},应该在代码中限制排序字段名,无法使用#{}解决。

0x02 MyBatis-Plus查询封装器Wapper使用不当

MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在。
使用时只需要在编写Mapper类时继承MyBatis-Plus的BaseMapper类,即可获得一些封装好的CURD方法,而不需要在XML中编写相关的SQL语句,比如save、remove、update等方法,这些方法的参数大多都支持传入查询条件过滤器wrapper。
Wrapper有四种,其结构关系见下图。

主要类型为两种,即查Query和改Update,改包括了增、删、改。然后又根据列名匹配是否使用Lambda表达式而多了LambdaQuery和LambdaUpdate两种Mapper。
在使用常规的QueryMapper和UpdateMapper时,会使用预编译的方式绑定参数,但是部分场景注入风险。

比如在使用QueryMapper中使用orderByASC,如果参数可控会存在SQL注入,相似的函数还有having、apply等拼接语句函数,因此如果在代码审计过程中关注到使用了MyBatis-Plus组件需要格外注意这些封装查询。

参考文献:
mybatis-plus条件构造器比较
mybatis plus 条件构造器queryWrapper学习

posted @ 2021-11-15 20:40  don0t  阅读(905)  评论(0编辑  收藏  举报