MyBatis注入的三种类型

MyBatis产生sql注入的原因

编写 xml 文件时,MyBatis 支持两种参数符号,#{}${}

  • #{} 使用预编译,通过 PreparedStatement 和占位符来实现,会把参数部分用一个占位符 ? 替代,而后注入的参数将不会再进行 SQL 编译,而是当作字符串处理。可以有效避免 SQL 注入漏洞
  • ${} 表示使用拼接字符串,将接受到参数的内容不加任何修饰符拼接在 SQL 中。易导致 SQL 注入漏洞。

两者的区别如下:

  1. #{} 为参数占位符 ?,即 SQL 预编译。${} 为字符串替换,即 SQL 拼接。
  2. #{} 是“动态解析->预编译->执行”的过程。${} 是“动态解析->编译->执行”的过程。
  3. #{} 的变量替换是在 DBMS 中。${} 的变量替换是在 DBMS 外。
  4. 变量替换后,#{} 对应的变量自动加上引号。变量替换后,${} 对应的变量不会加上引号。

一、模糊查询

1.1 漏洞利用

1
select * from user where id like '%${id}%'

若mybatis底层的代码是使用如上述的SQL查询代码,则攻击者通过构造id的值能够实现sql注入

攻击者通过提交参数值:?id=1%’ or 1=1#

实现SQL注入漏洞,成功查询到所有用户的数据

1.2 漏洞修复

正确的模糊查询方式应当使用CONCAT函数进行通配符的连接

1
select * from user where id like concat('%',#{id},'%')

二、带有IN谓语的查询

2.1 漏洞利用

1
select * from user where id in (${id})

若mybatis底层的代码是使用如上述的SQL查询代码,则攻击者通过构造id的值能够实现sql注入

攻击者通过提交参数值:?id=’1’) or 1=1#

实现SQL注入漏洞,成功查询到所有用户的数据

三、带有动态排序功能的查询

3.1 漏洞利用

1
select * from user order by ${column} limit 0,1

若mybatis底层的代码是使用如上述的SQL查询代码,则攻击者通过构造id的值能够实现sql注入

攻击者通过提交参数值:?column=username#

实现SQL注入漏洞,成功查询到所有用户的数据

参考链接:Mybatis下的SQL注入漏洞原理及防护方法 - 2ha0yuk7on - 博客园 (cnblogs.com)


MyBatis注入的三种类型
http://candyb0x.github.io/2024/07/03/MyBatis注入的三种类型/
作者
Candy
发布于
2024年7月3日
更新于
2024年7月3日
许可协议