zoukankan      html  css  js  c++  java
  • 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学习

  • 相关阅读:
    计网第一章——基本概念
    计网第二章——应用层
    命令行测试邮件发送工具mailsend-go
    CentOS-7-x86_64-DVD-2009 rpm包列表(centos7.9)
    CentOS-7-x86_64-Everything-2009 rpm包列表(CentOS7.9)
    Centos发行版ISO镜像中rpm包列表
    nginx使用记录
    centos resolv.conf
    python cookbook
    ansible中变量和主机名
  • 原文地址:https://www.cnblogs.com/donot/p/15557806.html
Copyright © 2011-2022 走看看