描述
Apache Shiro 1.5.2 之前,当使用 Apache Shiro 和 Spring 动态控制器时,特制请求可能会导致身份验证绕过。
影响版本
Apache Shiro ≤ 1.5.1
复现过程
- 启动环境:

2. 访问/admin

3.改Path /xxx/..;/admin/

成功绕过权限验证
原理分析
1.访问/xxx/..;/admin/
2.断点调试

发现域名被截断,变成了/xxx/..
我们跟进

发现在这个地方还是/xxx/..;/admin/
但这里要注意这个decodeAndCleanUriString()
函数,
我们接着跟进


可以看见对;
符号后面的字符串进行了截断,只保留了/xxx/..
最终就不需要进行身份验证了,也就是完成了权限绕过

官方修复方案
再1.5.2版本中对其进行了修复,获取requestURI的方式从request.getRequestUri直接获取的方式更改为获取request的ContextPath,ServletPath,PathInfo,然后再重新拼接而成。

客户修复方案
更新Apache Shiro ≥ 1.5.2。