CVE-2022-31656 VMware Workspace ONE Access UrlRewriteFilter 权限绕过
source link: https://y4er.com/posts/cve-2022-31656-vmware-workspace-one-access-urlrewritefilter-auth-bypass/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
CVE-2022-31656 VMware Workspace ONE Access UrlRewriteFilter 权限绕过
在我之前文章中写过,vm为了修复CVE-2022-22972加了一个HostHeaderFilter,拦截了Hostname,防止身份验证被绕过,建议看过之前的洞再来看这个。
Petrus Viet在UrlRewriteFilter过滤器中找到了用RequestDispatcher绕过权限校验的点。
原理如图,直接跳过HostHeaderFilter的校验(图来自Petrus Viet)
在org.tuckey.web.filters.urlrewrite.UrlRewriteFilter#doFilter
中
通过getUrlRewriter读路由重写规则
配置文件来自于file:/opt/vmware/horizon/workspace/webapps/SAAS/WEB-INF/urlrewrite.xml
拿到重写规则之后调用org.tuckey.web.filters.urlrewrite.UrlRewriter#processRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
进行处理
processRequest通过requestURI构建一条路由规则链RuleChain,然后调用org.tuckey.web.filters.urlrewrite.RuleChain#doRules
先做规则处理,遍历rules调用doRuleProcessing,然后再handleRewrite处理重写
来看doRuleProcessing
取rules当前遍历索引对应的规则rewrittenUrl,然后和this.finalToUrl还有request进行match得到rewrittenUrl
如果rewrittenUrl不为null,那么修改自身的finalToUrl字段和重写之后的请求字段finalRewrittenRequest
this.finalRewrittenRequest = rewrittenUrl;
this.finalToUrl = rewrittenUrl.getTarget();
相当于是遍历urlrewrite.xml找对应的规则进行匹配,然后传递结果给下一个rule当作参数。
来看urlrewrite.xml
匹配^/t/([^/]*)($|/)(((?!META-INF|WEB-INF).*))$
重写到/$3
,举个例子
/t/_/;/common.js
会被重写为/;/common.js
接着拿/;/common.js
匹配剩下的rule匹配不上了,所以最终的finalToUrl = "/;/common.js"
并且finalRewrittenRequest = rewrittenUrl
回到org.tuckey.web.filters.urlrewrite.RuleChain#doRules
接着看handleRewrite
因为上文finalRewrittenRequest不等于null,所以进入this.finalRewrittenRequest.doRewrite
forward转发之后不再继续走filter,跳过了HostHeaderFilter过滤,并且经过getRequestDispatcher之后servletPath变为/common.js
,分号被去除,完美绕过。
关于为什么分号被去除,老知识了,懂得都懂。
Petrus Viet提到的rce所涉及的类和controller我这个版本的ova没有,简单记录一下算了,
TenantMigrationResource.migrateTenant()
-> TenantMigrationServiceImpl.migrateTenant()
-> CustomGroupMigrationServiceImpl.migrateCustomGroup()
-> ExportCustomGroup.getVidmUserIds()
命令注入并不是在java的runtime.exec,而是在sh的参数中,通过pgsql的参数达到命令执行的效果,类似于pgsql堆叠。具体构造没有代码不写了。
和作者沟通了一下,另一个CVE-2022-31658 jdbc的rce应该是在另一个servlet容器cfg中。
/cfg/setup/test
补丁升级了pgsql的版本
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK