payload:/demo/..;/admin/index
简单的说因为有;导致截取了分号前面,也就是我们这里的 /demo/.. 然后和 /demo/** 匹配上了。
然后成功绕过shiro,在spring层;被忽视,然后成功匹配路径。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.1</version>
</dependency>
-
Apache Shiro <= 1.5.1
-
Spring 框架中只使用 Shiro 鉴权
将原先的 request.getRequestURI() 替换成了 getContextPath() 、getServletPath() 、getPathInfo() 的组合,这样就能获取我们想要的了,从而避免因为获取差异性而导致绕过,这样就与返回给 springboot 的路径保持一致了。
修复了因为;导致的截断问题。
Apache Shiro权限绕过漏洞CVE-2020-11989分析
payload:/admin/%252fxxx
漏洞产生的原因是因为 Spring 与 Shiro 之间对 url 的处理不同从而导致权限绕过.
简单的说就是shiro层进行了2次url解码,spring层使用了一次。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.2</version>
</dependency>
-
Apache Shiro <= 1.5.2
-
Spring 框架中只使用 Shiro 鉴权
-
需要后端特定的格式才可进行触发
-
即:Shiro权限配置必须为 /xxxx/* ,同时后端逻辑必须是 /xxx/{variable} 且 variable 的类型必须是 String
在 Shiro 1.5.3 版本中对getPathWithinApplication进行了修改,取消了url 解码的函数.
payload:/admin/%3Bxx
简单的说就是url解码了之后如果存在;就截断前面的路径并且会将截断的uri最后的 / 进行去除,然后就匹配不到/admin/*,因为是/admin
所以我们只要利用 /admin/%3Bxx这样的结构就可以绕过 Shiro 的权限校验。
同CVE-2020-11989
pom.xml 中版本修改为1.5.3
-
Apache Shiro < 1.6.0
-
Spring 框架中只使用 Shiro 鉴权
-
需要后端特定的格式才可进行触发
-
即:Shiro权限配置必须为 /xxxx/* ,同时后端逻辑必须是 /xxx/{variable} 且 variable 的类型必须是 String
https://github.com/apache/shiro/commit/dc194fc977ab6cfbf3c1ecb085e2bac5db14af6d
增加了 InvalidRequestFilter 类来对一些特殊情况进行处理,遇到特殊字符直接400,同时增加了 /** 的规则,来防止一些匹配不到的情况。
payload:/admin/%20
简单的说就是我们传递/admin/%20 url解编之后在进行匹配的时候去除了空格,/admin/ 与/admin/*不匹配造成绕过。
同 CVE-2020-11989 环境
pom.xml 中版本修改为 1.7.0 或及以下即可
-
Apache Shiro < 1.7.1
-
Spring 框架中只使用 Shiro 鉴权
-
需要后端特定的格式才可进行触发
-
即:Shiro权限配置必须为 /xxxx/* ,同时后端逻辑必须是 /xxx/{variable} 且 variable 的类型必须是 String
增加了选项,tokenizeToStringArray 函数中默认不会进行 trim,默认情况下 token = token.trim() 并不会被执行
/index/..;/admin/index
/login/..;/admin/index
/index/..;/admin/
/login/..;/admin/
/login/..;/json
/actuator/;/env/
/admin/;/xxx
/admin/%3b/xxx
/admin/%252fxxx
/admin/%3Bxx
/admin/%20
CVE-2022-32532 原理参考CVE-2022-22978 Spring Security RegexRequestMatcher 认证绕过及转发流程分析
参考: