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
|
|
相当于是遍历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
,分号被去除,完美绕过。
关于为什么分号被去除,老知识了,懂得都懂。
图
# rce
Petrus Viet提到的rce所涉及的类和controller我这个版本的ova没有,简单记录一下算了,
|
|
命令注入并不是在java的runtime.exec,而是在sh的参数中,通过pgsql的参数达到命令执行的效果,类似于pgsql堆叠。具体构造没有代码不写了。
# 修复
过滤分号
修改用户密码登录验证方式,不从外部接受参数作为校验api的地址。
# 后记
和作者沟通了一下,另一个CVE-2022-31658 jdbc的rce应该是在另一个servlet容器cfg中。
/cfg/setup/test
补丁升级了pgsql的版本
# 参考
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
如果你觉得这篇文章对你有所帮助,欢迎赞赏或关注微信公众号~