JAVA代码审计之鉴权学习

admin 2025年4月24日20:55:35评论5 views字数 4205阅读14分1秒阅读模式

1.代审的方式

在JAVA中鉴权的方式主要有4种:

1.

Interceptor拦截器 是spring下的

2.

Filter拦截器 是JAVA web下常见的

3.

Shrio安全框架 控制身份和权限的框架

4.

JWT令牌一种新的认证方式解决储存服务端的问题

对于JAVA中鉴权的思路:

没发现Interceptor ,就寻找Filter也没发现就继续寻找Shrio ,最后在找JWT

但是ShrioJWT的确认还是比较简单的,查看一下pom.xml文件中是否添加,或者查看lib包中是否有库

2.Interceptor 拦截器学习

1.Interceptor 介绍

拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。

你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置…

在 Spring中,当请求发送到 Controller 时,在被Controller处理之前,它必须经过 Interceptors(0或多个)。

Spring Interceptor是一个非常类似于Servlet Filter 的概念 。

JAVA代码审计之鉴权学习

在自定义Interceptor时,需要继承org.springframework.web.servlet.HandlerInterceptor接口或继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter在这我注册了一个Interceptor类,用于测试拦截器

JAVA代码审计之鉴权学习

开始写入配置自定义的拦截器注册到Web下

JAVA代码审计之鉴权学习
JAVA代码审计之鉴权学习

可以发现触发逻辑preHandle在到controller层前,然后在过了controllerpostHandle最后才是afterCompletion

JAVA代码审计之鉴权学习

看上面的图片就可以很容易理解拦截器的生命周期了。

Interceptor必须重写以下三个方法:preHandlepostHandleafterCompletion

preHandle 方法:在请求处理之前被调用。当它返回 false 时,表示拦截请求,不继续执行后续处理器;当它返回为 true 时,表示放行请求,继续执行后续处理器

postHandle 方法:在 Controller 方法调用之后执行

afterCompletion 方法:在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行

2.案例分析

这里我就不去部署了,因为网上已经把这个源码审烂了,咱们也就来学习学习Interceptor 拦截器的,并在此基础上学习鉴权文件的审计

http://github.com/newbee-ltd/newbee-mall/tree/master

按照刚刚咱们的介绍中,直接看config目录下的NeeBeeMallWebMvcConfigurer.java(这个根据每个开发者的习惯编写的,不一定一样)

JAVA代码审计之鉴权学习

可以发现开发者定义了三个拦截器,分别指定了路径去触发对应的拦截器,而我们需要关注的是拦截器中的认证流程。例如adminLoginInterceptor

JAVA代码审计之鉴权学习

我们只需要关注preHandle定义的代码逻辑,if的判断逻辑非常简单

JAVA代码审计之鉴权学习

判断uri的开通是不是/adminsession是不是空,如果都是则无法访问后台,于是构造 URI 为 /;/admin 或 //admin(不影响解析)成功绕过 Interceptor 进入后台

3.关键字

JAVA代码审计之鉴权学习

可以快速定位代码中鉴权文件

3.Filter 拦截器学习

1.Filter 简介

它在Java中的体现是一个对象,本质是Java中预先定义好了不同的接口,可以过滤不同的内容,具体怎么过滤,需要使用者定义一个实现类,然后实现接口中的过滤方法,在方法中书写过滤的条件。filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行

JAVA代码审计之鉴权学习

Filter的生命周期,过滤器我们已经看到了他的执行流程,但是,过滤器只有被创建出来才能执行,因此,我们还要了解过滤器生命周期。它包括了init、doFilter、destroy三个方法。

在这我编写一个Filter拦截器,功能就是记录拦截器的生命周期

JAVA代码审计之鉴权学习

比较懒借别人的图了:

1)初始化阶段:init(FilterConfig config)

触发时机Web 应用启动时(或 Filter 首次被请求时,取决于配置)。

执行次数仅一次Filter 初始化后会被容器缓存,后续请求复用。

主要作用

读取 web.xml 或 @WebFilter 注解中的配置参数(如 FilterConfig)。

初始化资源(如数据库连接、日志工具等)。

JAVA代码审计之鉴权学习

2)过滤阶段:doFilter(ServletRequest, ServletResponse, FilterChain)

触发时机每次请求 匹配到该 Filter 的 URL 时。

核心职责

对请求/响应进行预处理或后处理(如修改请求头、验证权限、记录日志)。

决定是否放行请求:调用 FilterChain.doFilter() 将控制权交给下一个 Filter 或目标 Servlet。

JAVA代码审计之鉴权学习

3)销毁阶段:destroy()

触发时机Web 应用停止或 Filter 被容器移除时。

执行次数仅一次

主要作用释放资源(如关闭数据库连接、清理临时文件)。

JAVA代码审计之鉴权学习

拦截器映射路径

urlPatterns字段是Filter说明使用位置的字段

精准路径:urlPatterns = "/index.jsp”

模糊路径:"/admin/*”

后缀过滤:urlPatterns = "*.jsp" 

这是从代码层的编写拦截器,还有一种是通过Web.xml进行控制的

JAVA代码审计之鉴权学习

2.案例分析

这里我就不去部署了,因为网上已经把这个源码审烂了,咱们也就来学习学习Filter拦截器的,并在此基础上学习鉴权文件的审计

http:// github.com/jishenghua/jshERP

首先我们先观察Filter文件LogCostFilter 

JAVA代码审计之鉴权学习

init初始化的值

JAVA代码审计之鉴权学习

作用在全局中uri上。

我们的重心主要关心在doFilter上,init去处理那些白名单字段

JAVA代码审计之鉴权学习

我相信读者也看出来了,只是简单的判断路径,并不是很绝对的去匹配路径,所以存在未授权访问后台的操作。

JAVA代码审计之鉴权学习

上面的POC都可以未授权获取用户。

3.关键字

JAVA代码审计之鉴权学习

可以快速定位代码中鉴权文件

4.Shrio安全框架

1.shrio 介绍

 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。

在审计Shrio等源码时,更因该看重ShiroConfig页面

JAVA代码审计之鉴权学习

Shiro思想重在Subject,SecurityManager和Realm下,Subject是一个实体,而Realm是实体的权限,SecurityManager是检查这个权限的重要对象

JAVA代码审计之鉴权学习

SpringBoot没有提供对Shiro的自动配置,因为Spring家族有自己的安全框架

JAVA代码审计之鉴权学习

shiro的标签的使用,从这里可以看出shrio是一个权限的控制器

JAVA代码审计之鉴权学习

shiro本身的安全问题非常少,因为他是以权限管理出名的框架

2.案例分析

这里我就不去部署了,因为网上已经把这个源码审烂了,咱们也就来学习学习Shrio安全框架的,并在此基础上学习鉴权文件的审计

下载:https://github.com/TyCoding/tumo

而这套代码并不是将认证逻辑写在ShrioConfig中的,而是通过tumo.properties去实现

JAVA代码审计之鉴权学习

在spring中bean注释会在启动时初始化所有的类,而这个类会去读取tumo.properties去实例化类

JAVA代码审计之鉴权学习
JAVA代码审计之鉴权学习

Spring 会在启动时扫描并初始化这些注释类@SpringConfiguration ,并初始化类。

所以我们只需要去关注tumo.properties 文件中的配置消息

JAVA代码审计之鉴权学习

查看 tumo.properties,发现有关 Shiro 的配置,其中 anon_url 为可匿名访问的路径(一般代表不需要鉴权)。不同于 Shiro 本身的漏洞,这里的鉴权漏洞是由于开发不当的 Shiro 配置所造成的。

测试删除评论,路由为 /comment/{id},提交方式为 DELETE。

JAVA代码审计之鉴权学习
JAVA代码审计之鉴权学习

只要知道id就可以未授权删除评论。

3.关键字:

JAVA代码审计之鉴权学习

可以快速定位代码中鉴权文件

5.JWT令牌

1.JWT 介绍

        http协议本身是一种无状态的协议,而这就意味着如果用户向应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行。因为根据http协议,服务器并不能知道是哪个用户发出的请求,所以为使得应用能识别是哪个用户发出的请求,需要在服务器存储一份用户登录的信息。登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用,这样应用就能识别请求来自哪个用户了,这就是传统的基于session认证。

拿出我写的历史代码:

JAVA代码审计之鉴权学习

可以发现是配合着拦截器编写的,所以拦截器的问题,JWT也会存在的,拦截器的路径

JAVA代码审计之鉴权学习

如果拦截器没有问题,我们需要去跟进JWT类实现的逻辑

生成JWT的代码

JAVA代码审计之鉴权学习

解码JWT的代码

JAVA代码审计之鉴权学习

密钥位置一边存放在application-dev.yml

JAVA代码审计之鉴权学习

2.案例分析

这里我就不去部署了,因为网上已经把这个源码审烂了,咱们也就来学习学习JWT令牌框架的,并在此基础上学习鉴权文件的审计

下载:https://github.com/shuhongfan/sky-take-out

在审计过程中,我们应该关注是否拦截器覆盖了我们要访问的路径,jwt是否不检测签名,jwt是否存在替换加密方式绕过等等。

但是我们现在的案例上述问题都没有,只有在使用框架时,jwtkey是默认的,到时攻击者可以使用默认密钥伪造身份进入后台

JAVA代码审计之鉴权学习

解JWT报错直接返回False,基本上无法绕过。

JAVA代码审计之鉴权学习

但是key值是硬编码,直接利用key伪造JWT进入后台

3.关键字

JAVA代码审计之鉴权学习

可以快速定位代码中鉴权文件

6.总结:

在JAVA代码审计中,Filter、Shiro、JWT 是常见的鉴权机制,审计时需重点关注权限控制、认证逻辑、安全配置避免越权、身份伪造、敏感信息泄露等风险。个人经验,如有错误希望师傅们纠正。

原文始发于微信公众号(T3Ysec):JAVA代码审计之鉴权学习

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月24日20:55:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JAVA代码审计之鉴权学习https://cn-sec.com/archives/3996466.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息