文章总结: 本文解析Servlet、SpringBoot及Shiro的鉴权机制。重点讲解Filter与Interceptor的审计方法,演示通过分号加后缀绕过Tomcat下getRequestURI()校验的缺陷。结合海康威视案例,提供定位配置文件与拦截器逻辑的实战路径,帮助识别鉴权绕过漏洞。 综合评分: 86 文章分类: 代码审计,WEB安全,漏洞分析
代码审计之Servlet与SpringBoot与shiro的鉴权机制
原创
secureyang secureyang
secureyang
2026年1月19日 20:06 北京
Servlet与SpringBoot与shiro的鉴权机制Servlet下的Filter鉴权Filter的生命周期Filter权限校验web.xml中配置Filter实现权限校验Spring下的路由鉴权Spring的路由鉴权简单代码实现怎么知道拦截器对哪些路径进行过拦截呢?怎么知道拦截的具体实现是怎样的?真实案例寻找配置文件寻找拦截器配置Shiro鉴权
Servlet与SpringBoot与shiro的鉴权机制
热部署
更新完代码之后,在 build 中选择重新编译即可实现代码加载
既第二节课的路由学习,第三节课开始学习鉴权机制
web.xml 文件一般存在于WEB_INF 目录下,我们可以通过这里面的路由,跳转到相对应的代码实现的类
Servlet下的Filter鉴权
首先第一种就是根据web.xml路由去查看各种操作(doGet与doPost)的鉴权,直接通过对参数是否存在或者参数值进行校验,从而实现鉴权,这种是最简单鉴权方式。比如下方给出一个案例:
这里就是,只要你通过web.xml文件的url-pattern成功访问到对应的类,就可以执行该类中的文件,然后只需要构造参数名token-key,就会默认你成功登录,然后再通过构造 fid 去下载文件。而至于 fid 在哪,格式是什么,我们可以再从源码其他地址去寻找。
我们打开源码之后,首先去找 web.xml 文件,然后对着 web.xml 文件去找 <url-pattern> 标签,该标签对应着我们要去访问的URL路径,然后再去找他所对应的 <servlet-name> 这里面就是所对应的类代码
Filter的生命周期
init -> doFilter -> destroy
所以我们主要审计的方法就是 doFilter
我们新建一个Filter_dome.java代码,让他继承自 HttpFilter,然后重写方法
此时,我们来访问一下 helloservlet,该类的路由如下图代码所示
我们看一下效果
我们发现,具体的请求流程是:请求先到Servlet的init进行servlet的初始化,再直接到Filter进行请求鉴权验证
Filter权限校验
那么,Filter 到底是如何对请求进行放行的呢,我们看下图
以上就是Filter的一个大致的基础用法,那么他一般到底是怎么对URL进行权限校验的呢?我们向下看
其实最简单的判断方法就是看你的请求URL当中是否含有无危害或者有危害的字段,比如:.css .js 等
所以一般简单的情况就会采取这样的方式来对请求路径做校验,我们从结果中可以看到,URL中没有 .css ,因此被禁止访问。
但是,针对 servlet 的tomcat的原理,使用 ; 会导致代码中所取到的URL字符串中可以包含.css,而在tomcat容器中,会将 ; 之后的内容过滤掉,因此,针对我们上述的场景,可以使用 ;.css 来绕过这个简单的权限校验
而且我们发现,参数竟然还成功传递和接收了,有点东西
但是,这种绕过方法也是有限制的,只针对 tomcat 容器情况下,使用 getRequestURL() 与 getRequestURI() 两种方法可以进行绕过,如果采用 getServletPath() 来获取请求路径的话,使用 ; 来绕过就是失败的。
web.xml中配置Filter实现权限校验
当然,Filter也同样可以在web.xml中去配置
Spring下的路由鉴权
这种情况会有一个单独写出来的可以不用 if 来判断的 路由鉴权
Spring boot 中有内置的tomcat容器,因此上述我们提到的 ; 绕过方法也是可以的
Spring的路由鉴权简单代码实现
第一步:注册一个拦截器到MVC框架中(为神马Filter不需要注册请看上面的图片对比)
当然啊,其实这里的 excludePathPatterns经过测试好像没起作用。
其中,新建的拦截器对象名称就是要实现的拦截器所对应的真实类名
我们来访问一下看看效果:
我们可以发现,请求到该URL的时候,第一时间会直接通过,但由于实际上并没有这个文件,所以会跳转到 /error 这个URL中去,但 拦截器 并没有允许这样的URL,因此又会出现 forbidden。而我们直接访问之前的路由,则是会被直接禁止。
因此,有了上述的基础之后我们再来看,如何去审计对应的问题:
怎么知道拦截器对那些路径进行过拦截呢?
进去之后直接搜 implements WebMvcConfigurer ,在这份文件里,会列出所有的拦截器,以及该拦截器要对应的拦截那些路径,放过那些路径。
怎么知道拦截的具体实现是怎样的?
Spring中我们进去可以去搜索 preHandler 这个方法,这个方法中则实现了对目标请求的校验,来判断到底是放行还是阻断,而且这个类方法的返回值是 bool 类型,因此它是通过返回结果为 true 或者 false 来判断的。
当然,我们一般更推荐先去搜 implements WebMvcConfigurer ,这个文件里会列出所有的拦截器,不然直接去搜索 preHandler 可能会有很多文件,看起来很乱。
然后找到对应的 拦截器 名称之后,再进入 拦截器去看就知道了。
如果不在 Spring 中的Filter类中做路由鉴权,而是在HandlerInterceptor接口中操作,通过preHandle类的实现实现到Filter,并且使用的是 request.getServletPath()。就无法绕过,但使用 request.getRequestURI() 还是依旧可以用 ;.css 这样的方式来绕过
真实案例
海康威视智能综合安防系统
寻找配置文件
- 进入源码之后,我们首先去找配置文件,怎么找呢,找到 WEB-INF 目录,再找到里面的 classes 目录,打开该目录,我们可以看到一个叫做 springMVC.xml,当然,也有可能重命名,比如这里就是 springMVC-servlet.xml
- 进入源码,双击 shift ,在弹出框中直接搜索 springMVC 即可
寻找拦截器配置
进入配置文件之后,直接搜索 interceptor
而下面的
这里其实就和SpringBoot框架中拦截器实现很相似,先是注册一个拦截器类到MVC框架中,然后再实现注册的这个类。
然后去找这个拦截器类具体位置在哪,复制类名,双击 shift,粘贴搜索
进入之后,去找上面提到的 preHandler 类
Shiro鉴权
Shiro鉴权绕过 | yemoli’s blog
进到源码之后,搜索 ShiroFilterFactoryBean shiroFilter
在这个类中,进行路由鉴权的时候,我们去找 filterChainDefinitionMap.put("/getName","anon"); 这样的代码,只要后面是有 anon 这个参数的,就表示该路径不需要鉴权
当然,这里面也可以用 ; 来 绕过路径的鉴权,从而导致绕过。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:secureyang secureyang secureyang《代码审计之Servlet与SpringBoot与shiro的鉴权机制》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论