OpenMetaData-CVE-2024-28848-权限绕过及RCE

权限绕过是我的弱项,做的分析并不多。而且shiro那一堆权限绕过历史漏洞我还没看过,未来一段时间打算注重这个方面的学习。

这里写篇文章记录下。

漏洞复现

1
http://localhost:8585/api/v1;v1%2Fv1%2Fusers%2Flogin/events/subscriptions/validation/condition/T(java.lang.Runtime).getRuntime().exec(new%20java.lang.String(T(java.util.Base64).getDecoder().decode(%22dG91Y2ggL3RtcC9zdWNjZXNz%22)))

其实就一条get请求。base64是touch /tmp/success

漏洞分析

从payload来看,此处用了一个trick ,之前看星球里有讨论过叫Path Variables

;aaa=bbb 如果出现在路由里,tomcat会把这段当成变量来处理。等同于?aaa=bbb

而openMetaData用的是jetty + glassfish, 也有tomcat的这个特性,虽然我直接搜没搜到,可能藏在官方文档的深处,我不想翻了。

所以上述路由实际上是/api/v1/events/subscriptions/validation/condition/{expression}

那么具体逻辑是如何的?

openMetaData的鉴权用的是jwt,鉴权逻辑在JwtFilter里。

image-20240819170027139

可以看到假如url里有EXCLUDED_ENDPOINTS就会直接放行,

image-20240819170228669

有很多直接放行的Endpoints,随便挑一个就能绕过。

但是此处还有一个要求,我们不能直接发送;v1/system/config ,必须把它url编码为

;v1%2Fsystem%2Fconfig这种才可以。所以服务器这边获取UrlInfo.getPath必须进行url解码才可以

image-20240819170431755

可以看到decode默认为true。那么权限绕过就OK了。

RCE部分就是常规的Spel注入了,我尝试了把base64换成直接输入命令但是好像路由会报错,所以就编个码吧。

总结:

Path Variables的trick

filter权限绕过


OpenMetaData-CVE-2024-28848-权限绕过及RCE
http://example.com/2024/08/19/OpenMetaData-CVE-2024-28848-权限绕过及RCE/
Aŭtoro
zhattatey
Postigita
August 19, 2024
Lizenta