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

2020-05-13 15:18:3911734人阅读

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。

1.png

在resources/db/application.properities配置文件中,已经启用了h2 console。

2.png

项目导入IDEA后启动,访问http://127.0.0.1:8080/h2-console,在Saved Settings下拉框中选择Generic JNDI Data Source,Setting Name和Driver Class会自动出现,如果没有出现可照下图配置。

3.png

接下来在VPS上用marshalsec监听LDAP服务,并将配置填入JDBC URL中,点击Connect或者Test Connection。

4.png


4、漏洞分析


点击Connect按钮后请求的uri为/h2-console/login.do,因此我们先在org/ h2/server/web/WebApp.class的login方法处打断点进行调试,此时可以获取所有传递进来的参数,var1为连接方法,var2即为恶意的ldap链接。

6.png

在代码918行,会尝试调用getConnection方法连接数据库,我们继续跟进到getConnection方法,由于var2为ldap链接不以”jdbc:h2:”字符串开始,因此跳过555行if请求,进入562行JdbcUtils.getConnection方法。

7.png

继续跟进到getConnection方法,178行会检查var0是否为空,不为空会进入else语句。

8.png

183行会判断Driver是否为javax.naming.InitialContext的父类或者接口,通过查询文档可知,Context才是InitialContext类的接口,因此190行判断条件为真。

9.png

继续往下在193行终于看到熟悉的lookup方法,var1参数为恶意ldap链接,成功触发JNDI注入。

5、防御措施


  1. 在配置文件中去掉spring.h2.console.enabled=true;
  2. 升级到较高版本的JDK;
  3. 使用安全防护产品进行临时防护。


百度安全智能一体化产品已经支持该漏洞的检测、拦截。


本文由百度安全原创,转载请注明出处和原文链接

0
现金券
0
兑换券
立即领取
领取成功