基于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
。
应该也可以直接改代码