0x00 前言
H2数据库是一个开源的关系型数据库。
H2是一个采用java语言编写的嵌入式数据库引擎,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制。
下面这个是CVE信息
0x01 漏洞复现
首先需要下载一个H2,然后直接启动,启动页面如下
这里我们使用典型的javax.naming.InitialContext JNDI进行测试:具体的JNDI可参考Java代码审计——Fastjson < 24 反序列
点击连接或者测试连接之后即可触发。
0x02 调用链
- doGet
- processReques
- process
- login
- getConnection
- login
- process
- processReques
首先来看数据包:
根据数据包可以从拦截器开始分析:
这里跟进到processReques
可以看到后缀.do的会先走到这里
接着根据login.do走到login方法
在login 方法中会调用getConnection
接着会调用getConnection
接着这里可以看到首先会拿到参数1的类,然后调用lookup方法从而触发JNDI。
以上
知识补充
H2
H2数据库是一个纯Java开发的关系型数据库管理系统(RDBMS),它支持SQL和JDBC标准,具有高性能、小巧、易于使用和部署等特点。同时,它还支持嵌入式、内存和分布式模式,可以满足不同场景的需求。
H2数据库的特点:
1.高性能:H2使用纯Java开发,在性能上比其他Java数据库更有优势,同时支持多种存储引擎,如内存、磁盘等。
2.小巧:H2的安装包非常小,可以轻松部署,也不需要安装复杂的数据库服务,只要安装JRE即可。
3.易于使用:H2具有简单易用的图形界面,支持丰富的标准SQL和JDBC接口,并提供详细的文档和示例,可以快速上手。
4.部署灵活:H2支持嵌入式、内存和分布式模式,可满足不同应用场景的需求,例如Web应用、桌面应用等。
H2数据库是一款小巧、高性能、易于使用和部署的Java数据库,非常适合中小型应用的开发和部署。
InitialContext JNDI
InitialContext是Java中的一个类,它允许应用程序通过Java命名和目录接口(JNDI)来访问命名和目录服务。JNDI是Java的一个标准,为应用程序提供了一个统一的接口来访问命名和目录服务,例如LDAP(轻型目录访问协议)和DNS(域名系统)。
InitialContext类是JNDI API的入门点,它提供了一个初始上下文来访问命名和目录服务。当应用程序需要访问命名和目录服务时,它调用InitialContext类来获得一个上下文对象。这个上下文对象可以用来查找和绑定对象,以及执行其他JNDI操作。
使用InitialContext和JNDI,开发人员可以很容易地将应用程序连接到现有的命名和目录服务,从而简化了应用程序的开发和维护工作。
processRequest
processRequest 通常是指一个函数或方法,它接受来自客户端的请求并对其进行处理。这个函数通常会检查请求的有效性,解析请求中的参数,调用适当的处理程序或逻辑来生成响应,然后返回响应给客户端。在 Web 开发中,processRequest 函数通常是在服务器端的代码中实现的,例如在 ASP.Net 中的 Page 类中的 ProcessRequest 方法中。
H2的数据库优点
H2数据库的优点如下:
-
轻量级:H2数据库仅有一个jar文件,非常小巧,适合嵌入式开发。
-
高性能:H2数据库支持并发,具有优异的性能表现,响应速度很快。
-
可移植性:H2数据库不仅可以在Java平台上使用,还可以在Windows、Linux等操作系统上使用。
-
开源:H2数据库是免费的开源软件,对于一些小型项目或者个人开发者来说,减小了成本开支。
-
支持多种数据库操作:H2数据库可以支持多种数据库操作方式,如SQL、JDBC、ODBC、Hibernate等,且支持多种数据存储格式,如CSV、Excel等。
-
支持多种模式:H2数据库支持多种模式,可以根据不同的业务需求进行配置。例如:In-Memory模式、Embedded模式等。
-
可扩展性:H2数据库具有良好的可扩展性,可以根据具体业务需求进行自定义开发。
总的来说,H2数据库具有小巧、高性能、可移植性、多数据操作方式、多种模式、可扩展性等优点,适合于小型项目或个人开发者使用。
Java代码审计学习方法
以下是Java代码审计学习方法的一些建议:
-
了解Java编程基础:在开始进行Java代码审计之前,需要掌握Java编程的基础知识,了解Java的语法,数据类型,控制流程等基本概念。
-
学习安全知识:了解常见的Web攻击类型,例如SQL注入、跨站脚本攻击(XSS)和跨站请求伪造(CSRF)等。
-
学习常见漏洞:学习已知的安全漏洞,理解攻击者利用这些漏洞的方法,例如未经验证的输入、代码注入和文件包含漏洞等。
-
寻找样例代码:一些开源的应用程序或框架可以用来学习Java代码审计,例如WordPress、Joomla和Struts等。通过分析这些代码,可以了解常见的安全问题和漏洞。
-
学习使用辅助工具:使用一些代码审计工具,例如FindBugs、SonarQube和Parasoft等,可以帮助发现代码中的错误和漏洞。
-
实践漏洞挖掘:通过实践,寻找一些样例代码中的漏洞,例如通过手动构造攻击向量,测试应用程序的安全性。
-
学习修复漏洞:理解漏洞修复的方法,例如安装补丁、更新库或修复代码中的错误。学习如何编写安全的代码,通过遵循安全编码实践来避免漏洞的产生。
Java代码审计需要对Java编程基础、Web安全、常见漏洞和修复方法等知识有充分的了解。通过实践和使用工具,可以提高对代码中漏洞的发现和修复能力。