MyBatis中Ognl引起的RCE
Yu9

过完年了,继续肝

记录一个新学到的知识MyBatis中Ognl引起的RCE

奇安信攻防社区-从一道CTF题浅谈MyBatis与Ognl的那些事 (butian.net)

之前没见过,记录一下。

就是mybatis中的在生成sql使用的是${}#{}蛮,并且mysql支持ognl表达式

在封装sql时会解析${}中的内容,然后导致ognl表达式

image-20240212204750908

image-20240212204755984

常见的场景一般是如下配置:

1
2
3
<select id="getUserByUserName" parameterType="String" resultMap="User">
select * from users where username like ${username}
</select>

Mybatis的设计者在设计之初就考虑到了这一个风险,实际情况在解析时只会解析原有的${username},解析完毕后再把用户输入的值赋予给他。避免了RCE的利用。

所以总结一下,实战中貌似很鸡肋。因为需要使用Provider注解指定某个工具类的方法来动态编写SQL,才能利用

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SelectProvider(type = FindUserByName.class, method = "getUser")
List<User> getUserByUserName(String name);

class FindUserByName {
public String getUser(String name) {
String s = new SQL() {
{
SELECT("*");
FROM("users");
WHERE("username='" + name+"'");
}
}.toString();
return s;
}
}

开发中应该几乎没有人会这样吧!

由 Hexo 驱动 & 主题 Keep
总字数 50.7k 访客数 访问量