当一个JDBC连接的URL可控时,存在一些攻击套路,在HITB2021SIN的议题中针对H2等数据库Driver的攻击思路进行了共享:
JDBC Attack
https://i.blackhat.com/eu-19/Thursday/eu-19-Zhang-New-Exploit-Technique-In-Java-Deserialization-Attack.pdf
近期Github pgjdbc上爆出了PostgreSQL JDBC Driver在URL可控的情况下存在2个相关漏洞,分别是远程命令执行漏洞CVE-2022-21724以及任意文件写入漏洞:
## 0x01 CVE-2022-21724描述
漏洞影响版本:
-
>= 9.4.1208,< 42.2.25
-
>= 42.3.0,< 42.3.2
从描述来看,PostgreSQL JDBC Driver根据`sslhostnameverifier`、`socketFactory`、`sslfactory`、`sslpasswordcallback`的值来完成实例化操作,但是由于缺少验证,导致可以构造恶意类加载实现RCE。
##0x02 任意文件写入漏洞描述
漏洞影响版本:
-
42.3.x < 42.3.3
-
42.1.x
从描述来看,漏洞与pgjdbc集成的日志操作功能有关,通过控制`loggerFile`、`loggerLevel`连接属性,可以造成任意文件写入漏洞。
为了方便分析,构造一个测试环境。引入`postgresql`:
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.3.1</version>
构造如下测试代码:
直接运行,查看报错信息:
提示找不到参数`socketFactoryClass`提供的恶意类`EvilClass`,我们在最后报错的代码处`org.postgresql.core.SocketFactoryFactory#getSocketFactory`打下断点,采用Debug模式运行,触发断点:
进入`ObjectFactory.instantiate`:
这里通过参数`socketFactoryClass`来实例化一个类,采用的构造函数只有一个输入参数来自`socketFactoryArg`,并且为`String`字符串类型。如果我们能在程序运行上下文环境中找到满足这些条件的类,就可能实现恶意操作。回顾Jackson经典的反序列化漏洞CVE-2017-17485,我们可以找到类`org.springframework.context.support.ClassPathXmlApplicationContext`,修改测试代码如下(引入`spring-context-support`):
其中poc.xml内容为:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder">
<constructor-arg value="calc" />
<property name="whatever" value="#{ pb.start() }"/>
</bean>
</beans>
成功实现RCE:
参考漏洞通报,构造如下测试代码:
漏洞触发原理比较简单,pgjdbc在连接提供的数据源时,会进行日志操作,将URL写入指定文件,代码位于`org.postgresql.Driver#connect`函数:
进入`setupLoggerFromProperties`函数:
所以可以通过参数`loggerFile`控制日志写入文件的路径和名称。回到`org.postgresql.Driver#connect`函数,完成日志操作初始化后,直接调用`LOGGER.log`将URL写入了日志。由于URL是完全可控的,所以我们可以实现任意文件写入。成功写入的`hack.jsp`文件内容如下:
结合实际Web应用和`../`路径穿越可GetShell。
## 0x01 CVE-2022-21724修复方式
限制了输入类型,导致无法调用加载恶意类。
## 0x02 任意文件写入漏洞修复方式
删除了`setupLoggerFromProperties`函数。
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
关注公众号回复“漏洞”获取研究环境或工具
原文始发于微信公众号(且听安全):【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造