0x00 前言
在陈师傅的星球中看到三梦师傅发了关于 Apache ShenYu 的最新漏洞通告,所以趁着热乎我也跟进一下
0x01 漏洞跟进
漏洞影响版本为 ShenYu 2.3.0 和 2.4.0 ,根据描述可以看到是 JWT 的验权被绕过了
找到 Github 链接,查看历史 commit 来寻找漏洞修复的 Commit ,并对比前后的修改
https://github.com/apache/incubator-shenyu/commit/f78adb26926ba53b4ec5c21f2cf7e931461d601d(Commit 翻了一会.. Orz 不知道师傅们有没有跟好的快速定位的方法)
这里将默认key给修改了
下载源码之后开始分析,首先漏洞描述里提到是admin的权限校验被绕过所以先去看 shenyu-admin 的模块部分代码
查看 pom.xml 中发现使用了 shiro ,所以先去看一下 shiro 部分实现的逻辑代码
来到 org.apache.shenyu.admin.shiro.config ,这里创建了 Filter 并添加到 FilterMap 里面,并且设置的路径是 /** ,这里创建 Filter 是为了让 jwt 来进行权限的管理
跟进查看 StatelessAuthFilter ,获取请求包中的 X-Access-Token 头里面的token 数据
会将获取到的 token 调用 subject.login
Shiro 登陆流程大致是这样的
所以接下来就会来到 org.apache.shenyu.admin.shiro.config#doGetAuthenticationInfo
可以看到压根没有对 jwt 的 key 进行校验
在 2.4.1 版本中进行了修复 增加了对 key 的校验
同时也修复了默认key的情况
0x02 漏洞复现
看了看github的readme发现有docker,所以索性在dockerhub上寻找了
默认账号密码为 admin/123456
> docker pull apache/shenyu-admin:2.4.0
> docker network create shenyu
> docker run -d -p 9095:9095 --net shenyu apache/shenyu-admin:2.4.0
生成 admin 账号的 jwt token
System.out.println(JWT.create().withClaim("userName", "admin").withExpiresAt(new Date()).sign(Algorithm.HMAC256("2095132720951327")));
替换之后同样成功进行了查询