SpringBoot+Shiro–CVE-2023-22602

基于Shiro(全系漏洞分析-截至20230331) – FreeBuf网络安全行业门户的漏洞分析

0x01 环境搭建

springboot 2.6.13 + shiro 1.10

tips:

1、shiro注意设置未授权登录的返回(默认是个jsp)

2、不需要用户登录的部分(不用设置用户密码什么的去登录的代码,shiroconfig中配置一下就完事了)

0x02 漏洞分析

我觉得这个漏洞是两个问题:1、shiro的../处理不足;2、spring的路径不是完全匹配

part1 shiro的../处理不足

一开始处理path的时候是”/admin/..”

normalize中处理的结果”/”

这里我进行调试的时候normalize返回的结果是“/”,之后会去和数组(包含所有配置的路径进行比对)

到这里shiro就把这个带有”/..”路径的请求变成了“/”,一般情况下根目录都是“anon”的访问权限,也就是说shiro放过了带有“/..”的请求

part 2 spring路径处理不足

根据文章里提到的内容定位到initLookupPath,打断点一步步分析

这里配置了attribute = null (应该就是默认配置)

一步步往下走,走到addMatchingMapings,这里感觉就有第一个问题了,sping匹配“/admin/..”的结果匹配出了“/admin/**”和”/**‘’

Q1:为什么有三个‘/**’

在之后根据匹配到的结果,去选择一个最优解(bestmatch)

Q2:bestmatch具体的匹配函数

在之后就根据这个去寻找对应的bean进行路径的响应了

0x03 修复

设置匹配路径 在application.yml设置使用antpathmather匹配路径

PS:Spring Boot 2.6 及以上:默认使用 PathPatternParser 进行路径匹配。
Spring Boot 2.5 及以下:默认使用 AntPathMatcher 进行路径匹配。
AntPathMatcher
通配符 *:匹配路径中的零个或多个字符,不包括斜杠 /
通配符 **:匹配零个或多个路径段,可以包括斜杠 /
问号 ?:匹配单个字符。
/api/*:匹配 /api/test,但不匹配 /api/test/123
/api/**:匹配 /api/test/api/test/123
/api/a?c:匹配 /api/abc/api/axc,但不匹配 /api/ac/api/abcc

PathPatternParser
通配符 {}:用于路径变量匹配。
***:与 AntPathMatcher 类似,但处理方式更高效。
路径解析和优化:解析路径时会去掉不必要的部分,比如冗余的斜杠。
/api/**:匹配 /api/test/api/test/123
/api/{id}:匹配 /api/123,并将 123 作为路径变量 id

应该也可以直接改代码

上一篇
下一篇