MyBatis注入的三种类型
MyBatis产生sql注入的原因
编写 xml 文件时,MyBatis 支持两种参数符号,#{}
和 ${}
#{}
使用预编译,通过 PreparedStatement 和占位符来实现,会把参数部分用一个占位符?
替代,而后注入的参数将不会再进行 SQL 编译,而是当作字符串处理。可以有效避免 SQL 注入漏洞。${}
表示使用拼接字符串,将接受到参数的内容不加任何修饰符拼接在 SQL 中。易导致 SQL 注入漏洞。
两者的区别如下:
#{}
为参数占位符?
,即 SQL 预编译。${}
为字符串替换,即 SQL 拼接。#{}
是“动态解析->预编译->执行”的过程。${}
是“动态解析->编译->执行”的过程。#{}
的变量替换是在 DBMS 中。${}
的变量替换是在 DBMS 外。- 变量替换后,
#{}
对应的变量自动加上引号。变量替换后,${}
对应的变量不会加上引号。
一、模糊查询
1.1 漏洞利用
1 |
|
若mybatis底层的代码是使用如上述的SQL查询代码,则攻击者通过构造id的值能够实现sql注入
攻击者通过提交参数值:?id=1%’ or 1=1#
实现SQL注入漏洞,成功查询到所有用户的数据
1.2 漏洞修复
正确的模糊查询方式应当使用CONCAT函数进行通配符的连接
1 |
|
二、带有IN谓语的查询
2.1 漏洞利用
1 |
|
若mybatis底层的代码是使用如上述的SQL查询代码,则攻击者通过构造id的值能够实现sql注入
攻击者通过提交参数值:?id=’1’) or 1=1#
实现SQL注入漏洞,成功查询到所有用户的数据
三、带有动态排序功能的查询
3.1 漏洞利用
1 |
|
若mybatis底层的代码是使用如上述的SQL查询代码,则攻击者通过构造id的值能够实现sql注入
攻击者通过提交参数值:?column=username#
实现SQL注入漏洞,成功查询到所有用户的数据
参考链接:Mybatis下的SQL注入漏洞原理及防护方法 - 2ha0yuk7on - 博客园 (cnblogs.com)
MyBatis注入的三种类型
http://candyb0x.github.io/2024/07/03/MyBatis注入的三种类型/