H2 Database Preferences 未授权访问漏洞封堵

591 阅读2分钟

背景

H2 Database Console未授权访问,默认情况下自动创建不存在的数据库,从而导致未授权访问。各种未授权访问的教程,但是它怎么封堵呢?

-ifExists

启动参数添加 -ifExists ,它的含义:

[-ifExists] Only existing databases may be opened (all servers)

应用出厂时先创建好数据库文件后,修改启动脚本,添加该参数:

dir=$(dirname "$0")
nohup java -cp "$dir/h2-2.x.xx.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Server -tcpAllowOthers -webAllowOthers -tcpPort -ifExists "$@" &

这样启动 h2 后首次访问时会因为 test 数据库不存在而无法连接: 在这里插入图片描述 只有输入正确的出厂数据库路径、帐号和密码,才能连接到数据库操作页面。

Preferences 未授权问题

上面只能封堵针对数据库操作的未授权访问,未登录时 Preferences 这个操作页面的 “shutdown” 按钮可以直接将 h2 服务停止,比前面的未授权更严重在这里插入图片描述

解决办法是升级到 2.x 版本,它自带了控制台管理员密码 webAdminPassord 配置,必须输入密码才能进入可选项配置页面。

在这里插入图片描述

悬案

1.x 版本控制台的可选项配置还是存在未授权访问问题,要么禁用 console 工具,要么配置防火墙策略允许特定主机访问 console 控制台请求,否则未授权情况下直接 shutdown 服务的话,就很危险了。

2.224 最新版本里面设置了adminLogin 登录密码,但是它的值设置是什么呢? 按最新操作手册说明,这个配置的值应该是用 org.h2.server.web.WebServer.encodeAdminPassword(明文) 运行出来的一个 hash 值,但是我在配置文件里面设置密码的哈希值后,输入密码始终不正确。而关于 h2 数据库的资料又少的可怜,好在升级为 2.224 最新版本的话,就不存在可选项配置的未授权访问问题了。

如果要搞明白这个管理员密码到底是何方神圣,估计只有运行源码来分析了!