如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。
免责声明
本博客所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。
前置知识
alwaysUseFullPath属性
当 Spring Boot 版本在小于等于 2.3.0.RELEASE 的情况下,alwaysUseFullPath 为默认值 false。

其会经过 getPathWithinServletMapping 方法进行处理。

而 getPathWithinServletMapping 会获取 ServletPath 并进行对应的处理,主要是调用 request.getServletPath( 对 uri 标准化处理,例如解码然后处理跨目录等一系列操作)方法,这就导致了可能的身份验证绕过。
SuffixPatternMatch属性
当设置了 SuffixPatternMatch 属性为 true 时,就是开启了后缀匹配模式,用于能以 .* 的方式进行匹配。
根据代码可以知道,当启用后缀匹配模式时,当传入的路径包括 46 (就是 . 号),会以 .* 结尾的方式进行匹配,pattern 是我们注册的路由,lookupPath 是我们访问的路由。
例如存在注册路由 /auth,会以 /auth.* 的形式进行匹配,即 /auth.css 和 /auth 的匹配结果是一样的。

实战绕过
目标环境大概有个拦截器如下,获取请求的 uri,如果其中不包含 login,就会校验是否登录,未登录状态下进行拦截。

登录接口 /login 是不需要校验的。

查询接口 /query 会校验是否登录。

查看 UrlPathHelper 类中的 alwaysUseFullPath,其为 true,所以很容易想到的就是通过 ../ 的方式来进行绕过,/login/../query,但因为当时目标环境是有 waf 的,. 号被过滤了,直接返回 403。


查看 RequestMappingHandlerMapping 类中的 SuffixPatternMatch 属性,其为 true,启用了后缀匹配模式 .*。

此时构造 /query.login 就成功绕过了,因为 uri.contains("login") 检测的就是只要 uri 中包含 login 即可。

7570

被折叠的 条评论
为什么被折叠?



