上一篇文章大概讲述了一下shiro以及spring获取uri的流程,总的来说shiro权限绕过是因为shiro与spring在对同一个请求获取uri时的处理步骤不同导致的,下面讲的两个权限绕过漏洞也是基于该原因
shiro < 1.5.2
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Day60o6-1659880688266)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213249296.png)]](https://1000bd.com/contentImg/2022/08/12/015556598.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rH291E41-1659880688267)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213317969.png)]](https://1000bd.com/contentImg/2022/08/12/015556735.png)
利用的是 shiro 和 spring 对 url 中的 “;” 处理差别来绕过校验。
uri获取逻辑
shiro:具体方法WebUtils#getRequestUri,方法先调用 decodeAndCleanUriString 方法处理请求路径,再调用 normalize 方法标准化路径。当uri中存在封号时,删除掉封号后面所有内容
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2td21GEz-1659880688267)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807212211677.png)]](https://1000bd.com/contentImg/2022/08/12/015557015.png)
spring:方法是 UrlPathHelper#decodeAndCleanUriString ,方法名也叫 decodeAndCleanUriString,但是呢操作完全不同。对于spring来说,对于封号的处理规则是其会删除掉两个反斜线中封号后面的内容,然后解码然后将//转换为/
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTgucxEI-1659880688267)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807212414665.png)]](https://1000bd.com/contentImg/2022/08/12/015557170.png)
所以说当payload为/admin/;/nice来说
在shiro眼里就是:/admin
PS:shiro在geturi后会将最后一个斜线删去,而/admin不匹配/admin/*
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EsAvpwfh-1659880688268)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807212944306.png)]](https://1000bd.com/contentImg/2022/08/12/015557435.png)
在spring眼里就是:/admin/nice
所以绕过了shiro认证
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8itYpi9G-1659880688268)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213059969.png)]](https://1000bd.com/contentImg/2022/08/12/015557565.png)
还有其他payload比如,但是无法在高版本使用,因为在高版本上不处理跨目录
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2U3I51ZG-1659880688268)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213439936.png)]](https://1000bd.com/contentImg/2022/08/12/015557634.png)
就只能借助 shiro 一些配置问题尝试绕过:比如应用程序配置了访问路径 “/admin/**” 为 anon,但是指定了其中的一个 “/admin/nice” 为 authc。这时在不跳目录的情况下,可以使用如下请求绕过:
http://127.0.0.1:8080/admin/;/nice
shiro 不再使用 request.getRequestURI() 来获取用户随意输入的请求路径,而是使用 request.getContextPath()、request.getServletPath()、request.getPathInfo() 进行拼接,直接获取中间件处理后的内容。
这种获取方式会对uri进行解码,shiro-782就是利用该特性绕过的
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBsKXwKx-1659880688269)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807213733390.png)]](https://1000bd.com/contentImg/2022/08/12/015557906.png)
shiro < 1.6.0
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OUUplCfJ-1659880688269)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214133634.png)]](https://1000bd.com/contentImg/2022/08/12/015558027.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mU3VWEMf-1659880688269)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214140233.png)]](https://1000bd.com/contentImg/2022/08/12/015558183.png)
在shiro 1.5.3中利用servletPath + pathInfo 的加法思路获取uri
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A1Cs2j81-1659880688270)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214327819.png)]](https://1000bd.com/contentImg/2022/08/12/015558452.png)
方法逻辑如下,里面均用request.getxxx,而request.getXX 方法,会进行 URL 解码操作。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXRoxJ3m-1659880688270)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214345866.png)]](https://1000bd.com/contentImg/2022/08/12/015558627.png)
uri获取逻辑
Shiro:先 URL 解码,再处理分号,然后标准化路径
Spring:先处理分号,再 URL 解码,然后标准化路径。下面图就是spring获取uri逻辑
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-82cccSMR-1659880688270)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807212414665.png)]](https://1000bd.com/contentImg/2022/08/12/015557170.png)
当payload为/admin/%3baaa时
在shiro眼里uri就是:/admin
在spring眼里uri就是:/admin/;aaa
所以绕过了shiro认证
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AqmNDWO9-1659880688270)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807214856977.png)]](https://1000bd.com/contentImg/2022/08/12/015559087.png)
shiro 没有改动现有的处理逻辑,而是选择了使用全局过滤和处理的方式
Shiro 创建了一个 global 的 filter:InvalidRequestFilter,用来过滤和阻断有危害的请求,会返回 400 状态码,其中包括:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2mEQVhc8-1659880688271)(C:\Users\91136\AppData\Roaming\Typora\typora-user-images\image-20220807215230709.png)]](https://1000bd.com/contentImg/2022/08/12/015559234.png)
总的来说就是shiro与spring在对同一个请求获取uri时的处理步骤不同,导致攻击者构造特殊的uri既可以绕过shiro认证且能够访问controller
https://su18.org/post/shiro-3
https://www.yuque.com/tianxiadamutou/zcfd4v/emcdeq
https://blog.csdn.net/weixin_43263451/article/details/126212097