长亭百川云 - 文章详情

Java Web开发中的SQL注入风险 - don0t

博客园 - don0t

38

2024-07-20

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学习

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2