此漏洞是由于在安装metabase时测试连接数据库发生的jdbc注入,metabase由clojure开发,该语言类似于groovy,有自己独立的编译器,编译为.class字节码运行在jvm中。于metabase支持的数据库众多导致其攻击面非常之广
漏洞分析
metabase在测试数据库时,唯一验证的token在/api/session/properties 中泄露
拿到此token便可以访问/api/setup/validate端点连接数据库
而在众多数据库依赖中,h2数据库最好利用,可以直接执行Java代码,关于jdbc攻击h2可以参考文章https://blog.csdn.net/mole_exp/article/details/124243446
而遗憾的是metabase在之前版本中修复了h2相关漏洞:https://github.com/metabase/metabase/security/advisories/GHSA-gqpj-wcr3-p88v在新版中会移除连接字符串中的init关键字
而在测试h2连接中,存在拼接sql语句的逻辑导致sql注入
我们只需要找到以下属性之外的某个属性(该属性需在h2连接属性的白名单之内),利用堆叠注入便可以完成任意sql语句执行,从而调用Java代码
h2连接属性在位于org.h2.engine.DbSettings,org.h2.engine.ConnectionInfo#KNOWN_SETTINGS,在其中任意挑选一个即可
构造如下payload,注意分号前面需要转义
jdbc:h2:mem:./tm;MODE=MSSQLServer;JMX=1\;CREATE TRIGGER test BEFORE SELECT ON INFORMATION_SCHEMA.TABLES AS $$//javascriptnjava.lang.Runtime.getRuntime().exec('calc.exe')$$--=x\
请尽快升级到最新版本:
https://github.com/metabase/metabase/releases/tag/v0.46.6.2
本文章仅供安全研究,请忽做非法用途
原文始发于微信公众号(非叶安全):metabase远程代码执行漏洞分析