代码审计之Servlet与SpringBoot与shiro的鉴权机制

admin 2026-01-20 01:07:01 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文解析Servlet、SpringBoot及Shiro的鉴权机制。重点讲解Filter与Interceptor的审计方法,演示通过分号加后缀绕过Tomcat下getRequestURI()校验的缺陷。结合海康威视案例,提供定位配置文件与拦截器逻辑的实战路径,帮助识别鉴权绕过漏洞。 综合评分: 86 文章分类: 代码审计,WEB安全,漏洞分析


cover_image

代码审计之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的鉴权机制》

评论:0   参与:  0