Apache-Inlong-JDBCAttack历史绕过学习
OSCS在5月9日更新了一个inlong的通告,是关于JDBC的攻击的。
在看最新绕过之前,先看看历史漏洞是怎么样的。
CVE-2023-34434
利用
没具体看,看了下通告,最初的绕过是把危险参数的value通过大小写绕过,true换成TRue就可绕过。
修复
这段自定义了SENSITIVE_REPLACE_PARAM_MAP和SENSITIVE_REMOVE_PARAM_MAP, 然后写了个filter
这里最开始直接用了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 |
|
在ConnectionUrlParser#parseQuerySection打断点。
问了下gpt。
所以随便插个空白符就能绕了。
修复
连同43668在1.9.0版本修复了,过滤了所有空白符。
同时mysql-connector包也更新到了安全版本.
8.0.20版本及以上还修复了反序列化,之后的绕过也只能打任意文件读取了。
CVE-2024-26579
新版本过滤的逻辑也有点变动,要看一下。
与之前不同的是,遍历的时候添加了一个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的连接语法,可以用()添加参数。
这样传参数便可以绕过敏感参数检查,后面再加#还可以注释掉REPLACE_MAP添加进的内容。从而绕过。
发现者的绕过:
看起来也是有点奇怪。
或者,更标准的写法: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