Spring MVC 某种场景下的权限绕过

Spring MVC版本在<5.3的情况下suffixPatternMatch默认为True.
1.png
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.*是相等的。

2.png
3.png
具体可以参考PatternsRequestCondition下的getMatchingPattern方法。

例如: 访问/hello/hello.test

此时patten/hello,lookupPath/hello.test

4.png
pattenlookupPath的内容一样时,则直接返回patten.如果不相等,则进入else中的if判断。

这里会判断useSuffixPatternMatch是否为true.而上文也提到了<5.3的情况下默认为true。
5.png
由于不满足第一个条件。会进入else条件

 boolean hasSuffix = pattern.indexOf(46) != -1;
if (!hasSuffix && this.pathMatcher.match(pattern + ".*", lookupPath)) {
        return pattern + ".*";
}

其中if会进行一次正则匹配。而在匹配规则中,pattern内容后添加了.*。则通配符,可以正确匹配到lookupPath的值。最后返回pattern+.*getMatchingPatterns方法,将其添加到matches中。
6.png

在后续的匹配中,由于.*通配符的存在,也是可以正确匹配到对应路径的。

部分场景下的权限绕过:

例如:

控制了/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>

本文链接:

https://websecuritys.cn/index.php/archives/443/
1 + 2 =
快来做第一个评论的人吧~