1.代审的方式
在JAVA中鉴权的方式主要有4种:
1.
Interceptor拦截器 是spring下的
2.
Filter拦截器 是JAVA web下常见的
3.
Shrio安全框架 控制身份和权限的框架
4.
JWT令牌一种新的认证方式解决储存服务端的问题
对于JAVA中鉴权的思路:
没发现Interceptor ,就寻找Filter,也没发现就继续寻找Shrio ,最后在找JWT。
但是Shrio和JWT的确认还是比较简单的,查看一下pom.xml文件中是否添加,或者查看lib包中是否有库
2.Interceptor 拦截器学习
1.Interceptor 介绍
拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。
你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置…
在 Spring中,当请求发送到 Controller 时,在被Controller处理之前,它必须经过 Interceptors(0或多个)。
Spring Interceptor是一个非常类似于Servlet Filter 的概念 。
在自定义Interceptor时,需要继承org.springframework.web.servlet.HandlerInterceptor接口或继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter类在这我注册了一个Interceptor类,用于测试拦截器
开始写入配置自定义的拦截器注册到Web下
可以发现触发逻辑preHandle在到controller层前,然后在过了controller是postHandle,最后才是afterCompletion
看上面的图片就可以很容易理解拦截器的生命周期了。
Interceptor必须重写以下三个方法:preHandle、postHandle、afterCompletion
•
preHandle 方法:在请求处理之前被调用。当它返回 false 时,表示拦截请求,不继续执行后续处理器;当它返回为 true 时,表示放行请求,继续执行后续处理器
•
postHandle 方法:在 Controller 方法调用之后执行
•
afterCompletion 方法:在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行
2.案例分析
这里我就不去部署了,因为网上已经把这个源码审烂了,咱们也就来学习学习Interceptor 拦截器的,并在此基础上学习鉴权文件的审计
http://github.com/newbee-ltd/newbee-mall/tree/master
按照刚刚咱们的介绍中,直接看config目录下的NeeBeeMallWebMvcConfigurer.java(这个根据每个开发者的习惯编写的,不一定一样)
可以发现开发者定义了三个拦截器,分别指定了路径去触发对应的拦截器,而我们需要关注的是拦截器中的认证流程。例如adminLoginInterceptor
我们只需要关注preHandle定义的代码逻辑,if的判断逻辑非常简单
判断uri的开通是不是/admin且session是不是空,如果都是则无法访问后台,于是构造 URI 为 /;/admin 或 //admin(不影响解析)成功绕过 Interceptor 进入后台
3.关键字
可以快速定位代码中鉴权文件
3.Filter 拦截器学习
1.Filter 简介
它在Java中的体现是一个对象,本质是Java中预先定义好了不同的接口,可以过滤不同的内容,具体怎么过滤,需要使用者定义一个实现类,然后实现接口中的过滤方法,在方法中书写过滤的条件。filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行
Filter的生命周期,过滤器我们已经看到了他的执行流程,但是,过滤器只有被创建出来才能执行,因此,我们还要了解过滤器生命周期。它包括了init、doFilter、destroy三个方法。
在这我编写一个Filter拦截器,功能就是记录拦截器的生命周期
比较懒借别人的图了:
1)初始化阶段:init(FilterConfig config)
•
触发时机:Web 应用启动时(或 Filter 首次被请求时,取决于配置)。
•
执行次数:仅一次,Filter 初始化后会被容器缓存,后续请求复用。
•
主要作用:
◦
读取 web.xml 或 @WebFilter 注解中的配置参数(如 FilterConfig)。
◦
初始化资源(如数据库连接、日志工具等)。
2)过滤阶段:doFilter(ServletRequest, ServletResponse, FilterChain)
•
触发时机:每次请求 匹配到该 Filter 的 URL 时。
•
核心职责:
◦
对请求/响应进行预处理或后处理(如修改请求头、验证权限、记录日志)。
◦
决定是否放行请求:调用 FilterChain.doFilter() 将控制权交给下一个 Filter 或目标 Servlet。
3)销毁阶段:destroy()
•
触发时机:Web 应用停止或 Filter 被容器移除时。
•
执行次数:仅一次。
•
主要作用:释放资源(如关闭数据库连接、清理临时文件)。
拦截器映射路径
urlPatterns字段是Filter说明使用位置的字段
精准路径:urlPatterns = "/index.jsp”
模糊路径:"/admin/*”
后缀过滤:urlPatterns = "*.jsp"
这是从代码层的编写拦截器,还有一种是通过Web.xml进行控制的
2.案例分析
这里我就不去部署了,因为网上已经把这个源码审烂了,咱们也就来学习学习Filter拦截器的,并在此基础上学习鉴权文件的审计
http:// github.com/jishenghua/jshERP
首先我们先观察Filter文件LogCostFilter
init初始化的值
作用在全局中uri上。
我们的重心主要关心在doFilter上,而init去处理那些白名单字段
我相信读者也看出来了,只是简单的判断路径,并不是很绝对的去匹配路径,所以存在未授权访问后台的操作。
上面的POC都可以未授权获取用户。
3.关键字
可以快速定位代码中鉴权文件
4.Shrio安全框架
1.shrio 介绍
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。
在审计Shrio等源码时,更因该看重ShiroConfig页面
Shiro思想重在Subject,SecurityManager和Realm下,Subject是一个实体,而Realm是实体的权限,SecurityManager是检查这个权限的重要对象
SpringBoot没有提供对Shiro的自动配置,因为Spring家族有自己的安全框架
shiro的标签的使用,从这里可以看出shrio是一个权限的控制器
shiro本身的安全问题非常少,因为他是以权限管理出名的框架
2.案例分析
这里我就不去部署了,因为网上已经把这个源码审烂了,咱们也就来学习学习Shrio安全框架的,并在此基础上学习鉴权文件的审计
下载:https://github.com/TyCoding/tumo
而这套代码并不是将认证逻辑写在ShrioConfig中的,而是通过tumo.properties去实现
在spring中bean注释会在启动时初始化所有的类,而这个类会去读取tumo.properties去实例化类
Spring 会在启动时扫描并初始化这些注释类@SpringConfiguration ,并初始化类。
所以我们只需要去关注tumo.properties 文件中的配置消息
查看 tumo.properties,发现有关 Shiro 的配置,其中 anon_url 为可匿名访问的路径(一般代表不需要鉴权)。不同于 Shiro 本身的漏洞,这里的鉴权漏洞是由于开发不当的 Shiro 配置所造成的。
测试删除评论,路由为 /comment/{id},提交方式为 DELETE。
只要知道id就可以未授权删除评论。
3.关键字:
可以快速定位代码中鉴权文件
5.JWT令牌
1.JWT 介绍
http协议本身是一种无状态的协议,而这就意味着如果用户向应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行。因为根据http协议,服务器并不能知道是哪个用户发出的请求,所以为使得应用能识别是哪个用户发出的请求,需要在服务器存储一份用户登录的信息。登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样应用就能识别请求来自哪个用户了,这就是传统的基于session认证。
拿出我写的历史代码:
可以发现是配合着拦截器编写的,所以拦截器的问题,JWT也会存在的,拦截器的路径
如果拦截器没有问题,我们需要去跟进JWT类实现的逻辑
生成JWT的代码
解码JWT的代码
密钥位置一边存放在application-dev.yml中
2.案例分析
这里我就不去部署了,因为网上已经把这个源码审烂了,咱们也就来学习学习JWT令牌框架的,并在此基础上学习鉴权文件的审计
下载:https://github.com/shuhongfan/sky-take-out
在审计过程中,我们应该关注是否拦截器覆盖了我们要访问的路径,jwt是否不检测签名,jwt是否存在替换加密方式绕过等等。
但是我们现在的案例上述问题都没有,只有在使用框架时,jwt的key是默认的,到时攻击者可以使用默认密钥伪造身份进入后台
解JWT报错直接返回False,基本上无法绕过。
但是key值是硬编码,直接利用key伪造JWT进入后台
3.关键字
可以快速定位代码中鉴权文件
6.总结:
在JAVA代码审计中,Filter、Shiro、JWT 是常见的鉴权机制,审计时需重点关注权限控制、认证逻辑、安全配置,避免越权、身份伪造、敏感信息泄露等风险。个人经验,如有错误希望师傅们纠正。
原文始发于微信公众号(T3Ysec):JAVA代码审计之鉴权学习
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论