Spring MVC 某种场景下的权限绕过
Spring MVC版本在<5.3
的情况下suffixPatternMatch
默认为True
.
在setUseSuffixPatternMatch
方法上方也可以看到相关注释:
/**
* Whether to use suffix pattern match (".*") when matching patterns to
* requests. If enabled a method mapped to "/users" also matches to "/users.*".
* <p>The default value is {@code true}.
* <p>Also see {@link #setUseRegisteredSuffixPatternMatch(boolean)} for
* more fine-grained control over specific suffixes to allow.
*/
该方法为是否启用后辍匹配,如果启用,则映射到/users
的方法也可以匹配到/users.*
.
/users
和/users.*
是相等的。
具体可以参考PatternsRequestCondition
下的getMatchingPattern
方法。
例如: 访问/hello
和/hello.test
此时patten
为/hello
,lookupPath
为/hello.test
当patten
和lookupPath
的内容一样时,则直接返回patten
.如果不相等,则进入else中的if判断。
这里会判断useSuffixPatternMatch
是否为true
.而上文也提到了<5.3
的情况下默认为true。
由于不满足第一个条件。会进入else条件
boolean hasSuffix = pattern.indexOf(46) != -1;
if (!hasSuffix && this.pathMatcher.match(pattern + ".*", lookupPath)) {
return pattern + ".*";
}
其中if会进行一次正则匹配。而在匹配规则中,pattern
内容后添加了.*
。则通配符,可以正确匹配到lookupPath
的值。最后返回pattern+.*
给getMatchingPatterns
方法,将其添加到matches
中。
在后续的匹配中,由于.*
通配符的存在,也是可以正确匹配到对应路径的。
部分场景下的权限绕过:
例如:
控制了/login 的访问,但是可以通过后辍匹配的形式去访问 /login.do
,login.html
等。
在部分环境中,开发者使用了Spring security
进行访问控制。
Arrays.asList("/js/**.js", "/css/**.css", "/images/**","/**/**.html")
上面的规则代表,我们只能访问指定目录下的特定文件。而最后一条/**/**.html
。则是可以访问任意路径下的html文件。当网站使用Spring MVC进行开发,其版本较低。就可以利用其特性绕过。
如: /user/list
= 无法访问 /user/list.html
= 正常访问 满足规则/**/**.html
要利用此特性有个必要的前提条件,DispatcherServlet的url-pattern必须为匹配所有请求。
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>