Spring Boot + H2 JNDI注入漏洞复现分析

1、漏洞描述

近日,百度云安全团队监测到互联网上爆出了Spring Boot + H2 JNDI注入漏洞详情,如果用户的Spring Boot项目中包含h2database库,并且在配置文件中启用了h2-console,则可能受到漏洞影响,攻击者在不需要任何权限的情况下即可在受影响服务器上执行任意命令。

2、漏洞环境

Spring Boot + H2 spring.h2.console.enabled=true JDK < 6u201、7u191、8u182、11.0.1(LDAP)

3、漏洞复现

下载Spring Boot + H2的测试代码,地址为: https://github.com/felix1982/spring-boot-practice/tree/master/spring-boot-h2, 依赖中已经包含spring boot+h2。 在resources/db/application.properities配置文件中,已经启用了h2 console。 项目导入IDEA后启动,访问http://127.0.0.1:8080/h2-console,在Saved Settings下拉框中选择Generic JNDI Data Source,Setting Name和Driver Class会自动出现,如果没有出现可照下图配置。 接下来在VPS上用marshalsec监听LDAP服务,并将配置填入JDBC URL中,点击Connect或者Test Connection。

4、漏洞分析

点击Connect按钮后请求的uri为/h2-console/login.do,因此我们先在org/ h2/server/web/WebApp.class的login方法处打断点进行调试,此时可以获取所有传递进来的参数,var1为连接方法,var2即为恶意的ldap链接。 在代码918行,会尝试调用getConnection方法连接数据库,我们继续跟进到getConnection方法,由于var2为ldap链接不以”jdbc:h2:”字符串开始,因此跳过555行if请求,进入562行JdbcUtils.getConnection方法。 继续跟进到getConnection方法,178行会检查var0是否为空,不为空会进入else语句。 183行会判断Driver是否为javax.naming.InitialContext的父类或者接口,通过查询文档可知,Context才是InitialContext类的接口,因此190行判断条件为真。 继续往下在193行终于看到熟悉的lookup方法,var1参数为恶意ldap链接,成功触发JNDI注入。

5、防御措施

  1. 在配置文件中去掉spring.h2.console.enabled=true;
  2. 升级到较高版本的JDK;
  3. 使用安全防护产品进行临时防护。
百度安全智能一体化产品已经支持该漏洞的检测、拦截。