关注公众号回复“漏洞”获取研究环境或工具
前面公众号已经给小伙伴们分享过一个Apache ShenYu认证绕过漏洞CVE-2021-37580:
CVE-2021-37580
QCyber,公众号:且听安全【最新漏洞预警】CVE-2021-37580 Apache ShenYu 管理员认证绕过漏洞分析
ShenYu(原名 Soul)是一款高性能,响应式的网关,同时也是应用于所有微服务场景的,可扩展、高性能、响应式的 API 网关解决方案。
Apache官方漏洞通报:
Apache ShenYu v2.4.0和v2.4.1版本存在Groovy&SpEL表达式注入漏洞。
参考
https://www.bookstack.cn/read/apache-shenyu-2.4.0-zh/d05c2399aa8f5fff.md
采用本地部署的方式。拉取漏洞版本导入idea,maven自动完成依赖项下载安装。工程目录结构如下:
提供web服务的接口包括2个,分别是`shenyu-admin`和`shenyu-bootstrap`。`shenyu-admin`是后台程序,默认端口是`9095`:
`shenyu-bootstrap`服务默认端口是`9195`:
通过对比分析,发现新版本直接删除了`Groovy`和`SpEL`插件。我们以`SpEL`插件为例,首先定位`SpEL`解析点`org.springframework.expression.spel.standard.SpelExpressionParser`的父类`TemplateAwareExpressionParser`,查看表达式解析函数`parseExpression`被调用情况:
大部分调用都是用于进行Test测试,最终定位一个潜在调用点位于`org.apache.shenyu.plugin.base.AbstractShenyuPlugin#execute`函数:
`AbstractShenyuPlugin`是插件的基类。在测试过程中,当我们访问`shenyu-bootstrap`服务(端口为`9195`)时,程序必然会进入`AbstractShenyuPlugin#execute`函数,通过调试发现,在遍历插件过程中默认情况下只有`context_path`和`divide`这2个插件经过`obtainPluginData`函数处理后返回非空,并且进入`if`条件,而要进入潜在触发点`matchSelector`还必须保证插件存在`Selector`配置。
我们首先需要在`shenyu-admin`服务(端口为`9095`)中进行插件的配置。我们这里选择对插件`divide`添加`Selector`:
回顾前面的调用栈截图,因为需要经过`AndMatchStrategy#match`处理,所以上面的`matchType`配置为`and`。
接下来重启`shenyu-bootstrap`服务,并构造如下请求:
/new%20java.lang.ProcessBuilder%28%22calc%22%29.start%28%29
顺利进入断点:
往下走进入`SpEL`表达式注入漏洞触发点:
实现RCE:
配置`Groovy`插件同样可以触发RCE,这里不再赘述,有兴趣的小伙伴可以自行研究。同时,结合CVE-2021-37580管理员认证绕过漏洞,可以达到匿名RCE的效果。
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
关注公众号回复“漏洞”获取研究环境或工具
原文始发于微信公众号(且听安全):【最新漏洞预警】CVE-2021-45029 Apache ShenYu Groovy&SpEL表达式注入漏洞分析与复现