Apache-Inlong-JDBCAttack历史绕过学习

OSCS在5月9日更新了一个inlong的通告,是关于JDBC的攻击的。
在看最新绕过之前,先看看历史漏洞是怎么样的。

CVE-2023-34434

利用

没具体看,看了下通告,最初的绕过是把危险参数的value通过大小写绕过,true换成TRue就可绕过。

修复

https://github.com/apache/inlong/commit/8390f8182457f76c87c66d45d3e5904cc5a08bb5#diff-45d94c999b307075e81525a2d60fd5c44fcd41183ad98ff3373b8109e0aa0c51

image-20240520212102270

这段自定义了SENSITIVE_REPLACE_PARAM_MAP和SENSITIVE_REMOVE_PARAM_MAP, 然后写了个filter
image-20240520212124112
这里最开始直接用了URLDecoder.decode, url编码绕过无效。
然后把querystring部分截下来,打成key-value形式后丢进queryMap,然后和上面两个黑名单Map对比是否匹配。如果匹配到危险参数,就做删除或替换操作。最后再加到连接的url后面。

CVE-2023-43668

在mysql-connector在8.0.1x中(某个版本修复了),可以通过allowLoadLocalInFile来完成任意文件读取,这个选项默认为true。
所以如果不添加任何参数,就不会走到敏感参数检查的判断里,所以仍然存在任意文件读取。
而inlong的jar包刚好没有超过修复版本,这也导致了CVE-2023-43668

CVE-2023-46227

利用\t符号进行绕过,实际上不止\t,所有空白符都可以,这个和mysql-connector源码有关。

比如用\f

1
Class.forName("com.mysql.cj.jdbc.Driver");            DriverManager.getConnection("jdbc:mysql://localhost:3306/test?\fallowLoadLocalInfile=true");

在ConnectionUrlParser#parseQuerySection打断点。
image-20240520212202636
问了下gpt。
image-20240520212212848
所以随便插个空白符就能绕了。

修复

连同43668在1.9.0版本修复了,过滤了所有空白符。
同时mysql-connector包也更新到了安全版本.
image-20240520212229029
8.0.20版本及以上还修复了反序列化,之后的绕过也只能打任意文件读取了。

CVE-2024-26579

新版本过滤的逻辑也有点变动,要看一下。
image-20240520212243753
与之前不同的是,遍历的时候添加了一个paramList,如果监测到危险参数就直接continue,不添加到paramList去。
最后在paramList把SENSITIVE_REPLACE_PARAM_MAP给丢进去,相当于一个覆盖操作。

我在mysql-connector源码跟了半天流程看看传参数有没有其他处理方法,没找到。
官方文档:
https://dev.mysql.com/doc/connector-j/en/connector-j-reference-jdbc-url-format.html

mysql的连接语法,可以用()添加参数。
image-20240520212258688
这样传参数便可以绕过敏感参数检查,后面再加#还可以注释掉REPLACE_MAP添加进的内容。从而绕过。

发现者的绕过:
image-20240520212315998

image-20240520212326395看起来也是有点奇怪。

或者,更标准的写法:
jdbc:mysql://(host=127.0.0.1,port=3306,allowLoadLocalInfile=true)/test?maxAllowedPacket=655360#

参考:
https://github.com/rmb122/rogue_mysql_server.git
https://www.oscs1024.com/hd/MPS-7rbq-ze46
https://avd.aliyun.com/search?q=inlong
https://mp.weixin.qq.com/s/lmoWKK41ZQzZOh-P26VUng


Apache-Inlong-JDBCAttack历史绕过学习
http://example.com/2024/05/20/Apache-Inlong-JDBCAttack历史绕过学习/
Aŭtoro
zhattatey
Postigita
May 20, 2024
Lizenta