Java代码审计鉴权绕过

admin 2025年5月8日09:08:31评论1 views字数 6645阅读22分9秒阅读模式

0x01 鉴权方式 & 审计思路

1、目前主流的鉴权方式

Interceptor 是一种拦截器,也称之为拦截器链(Interceptor Chain),主要用于拦截请求、响应或处理过程中的某些事件,比如权限认证、日志记录、性能测试等。在 Java 中,Interceptor 可以用来扩展框架,增加或修改某个方法的行为,或者对应用流程做些前置处理、后置处理、环绕处理等。

Filter 被称为过滤器,过滤器实际上就是对 Web 资源进行拦截,做一些处理后再交给下一个过滤器或 Servlet 处理,通常都是用来拦截 request 进行处理的,也可以对返回的 response 进行拦截处理。开发人员利用 filter 技术,可以实现对所有 Web 资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

Shiro 是一个强大且易用的 Java 安全框架,执行身份验证、授权、密码和会话管理。使用 Shiro 的易于理解的 API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

JWT(JSON Web Token),将用户信息加密到 token 里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证 token,通过 token 验证用户身份。基于 token 的身份验证可以替代传统的 cookie+session 身份验证方法。这使得 JWT 成为高度分布式网站的热门选择,在这些网站中,用户需要与多个后端服务器无缝交互。

2、鉴权漏洞审计思路

不同于常规审计思路,鉴权漏洞几乎没有业务关键词供搜索,其特征较弱。所以,针对鉴权漏洞的代码审计,思路为直接找鉴权技术特征目录进行代码追溯:

  • 找有没有 Interceptor ,拦截器里有没有鉴权
  • 找有没有 Filter ,过滤器里有没有鉴权
  • 找有没有 Shiro ,看版本及里面的逻辑配置
  • 找有没有 JWT ,看后面写的四个方向确定
  • 若以上都没有,可能是自写的鉴权代码

0x02 Interceptor 鉴权审计 - NewbeeMall 电商系统

1、项目介绍 - NewbeeMall

Newbee-mall 项目是一套电商系统,包括 newbee-mall 商城系统及 newbee-mall-admin 商城后台管理系统,基于 Spring Boot 2.X 及相关技术栈开发。

前台商城系统包含首页门户、商品分类、新品上线、首页轮播、商品推荐、商品搜索、商品展示、购物车、订单结算、订单流程、个人订单管理、会员中心、帮助中心等模块。

后台管理系统包含数据面板、轮播图管理、商品管理、订单管理、会员管理、分类管理、设置等模块。

下载:https://github.com/newbee-ltd/newbee-mall

2、Interceptor 补充介绍

Java代码审计鉴权绕过

Interceptor 需重写的方法

Interceptor 必须重写以下三个方法:preHandle、postHandle、afterCompletion。

preHandle 方法

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

postHandle 方法

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

afterCompletion 方法

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

public class LogInterceptor extends HandlerInterceptorAdapter {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {           long startTime = System.currentTimeMillis();            System.out.println("n-------- LogInterception.preHandle --- ");             System.out.println("Request URL: " + request.getRequestURL());             System.out.println("Start Time: " + System.currentTimeMillis());             request.setAttribute("startTime", startTime);             return true;    }    @Override   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {       System.out.println("n-------- LogInterception.postHandle --- ");              System.out.println("Request URL: " + request.getRequestURL());    }    @Override   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {           System.out.println("n-------- LogInterception.afterCompletion --- ");           long startTime = (Long) request.getAttribute("startTime");           long endTime = System.currentTimeMillis();           System.out.println("Request URL: " + request.getRequestURL());           System.out.println("End Time: " + endTime);           System.out.println("Time Taken: " + (endTime - startTime));       }}

假如有三个不同的 Interceptor,它们的配置如下:

Interceptor 的默认执行顺序为其注册顺序。

此外,还可以使用 InterceptorRegistry#order(int) 方法指定执行顺序,并且该方法中传入的值越小,对应的 Interceptor 优先级越高。

@Configurationpublic class WebConfig implements WebMvcConfigurer {    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new LogInterceptor());      registry.addInterceptor(new OldLoginInterceptor()).addPathPatterns("/admin/oldLogin"); registry.addInterceptor(newAdminInterceptor()).addPathPatterns("/admin/*").excludePathPatterns("/admin/oldLogin");    }}

3、NewbeeMall - Interceptor 鉴权 - 代码审计3.1、确定鉴权方式

翻阅 pom.xml 和 External Libraries,未观察到 ShiroJWT 关键字,由此排除使用 Shiro、JWT 进行鉴权的可能。

继续深入翻阅项目文件,发现在 interceptor 文件夹下存在三个文件:AdminLoginInterceptor

NewBeeMallCartNumberInterceptor

NewBeeMallLoginInterceptor

Java代码审计鉴权绕过

3.2、AdminLoginInterceptor >> preHandle >> uri.startsWith

分析 AdminLoginInterceptor 的 preHandle 方法可知:当请求的 URI 以 /admin 开头,并且 Session 中的 loginUser 属性为 null 时,该拦截器将执行拦截操作。

Java代码审计鉴权绕过

3.3、漏洞利用

由于 Session 无法伪造,那么可以从 URI 入手。试想一下,若构造一个不以 /admin 开头的 URI ,那不就可以放行了吗?于是,构造 URI 为 ;/admin 或 //admin (这些 URI 不影响解析),通过这种方式成功绕过了 Interceptor 进入后台。

Java代码审计鉴权绕过

0x03 Filter 鉴权审计 - 华夏 ERP 进销存系统

1、项目介绍 - 华夏 ERP

华夏 ERP 是目前唯一完整开源的进销存系统,具备进销存与财务功能(仅含后台)。

核心框架:SpringBoot 2.0.0

持久层框架:Mybatis 1.3.2

日志管理:Log4j 2.10.0

项目环境要求:

Mysql 5.7 及以上版本

JDK 1.8

Maven 3.2.3

下载地址:https://github.com/jishenghua/jshERP

2、华夏 ERP - Filter - 代码审计

2.1、确定鉴权方式

翻阅 pom.xml 和 External Libraries,未发现 Shiro、JWT 相关关键字,由此排除该项目使用 Shiro、JWT 进行鉴权的可能性。进一步深入翻阅项目文件,在 filter 文件夹下找到 LogCostFilter 文件。其 urlPatterns 设置为匹配所有请求,对 doFilter 方法进行分析后发现,其中确实包含与鉴权相关的代码逻辑。因此,可以确定该项目采用 Filter 进行鉴权。

Java代码审计鉴权绕过

2.2、LogCostFilter >> urlPatterns >> doFilter >> requestUrl,ignoredList,allowUrl

对 LogCostFilter 的 doFilter 方法进行分析后,梳理出其具体的放行和拦截逻辑如下:

  1. 用户登录状态检查
    :首先检查用户是否已登录,若已登录,则直接放行请求。
  2. 特殊页面放行
    :默认放行登录页和注册页,确保用户能够正常访问这些基础功能页面。
  3. 忽略列表检查
    :判断当前请求的 URL 是否存在于忽略列表(ignoredList)中,若存在,则予以放行。
  4. 允许列表检查
    :检查请求的 URL 是否属于允许列表(allowUrl)中的一员,若是,则同样放行请求。
  5. 其他情况处理
    :若上述条件均不满足,系统将把用户重定向到登录页,要求用户进行登录操作 。
Java代码审计鉴权绕过

分析 init 方法,得知以下信息:

  • ignoredList << ignoredUrl = ".css#.js#.jpg#.png#.gif#.ico"
  • allowUrls << filterPath = "/user/login#/user/registerUser"
Java代码审计鉴权绕过

2.3、漏洞利用

      根据上面得到的信息,从 URI 入手,构造 URI 为:

/login.html/../account/getAccount/register.html/../account/getAccount/ch4ser.css/../account/getAccount/ch4ser.jpg/../account/getAccount/user/login/../../account/getAccount/user/registerUser/../../account/getAccount........
Java代码审计鉴权绕过

0x04 Shiro 鉴权审计 - Tumo 博客系统

1、项目介绍 - Tumo 博客系统

Tumo Blog 是一个简洁美观的博客系统,基于 SpringBoot2.X + Vue.js 技术栈开发。

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

2、Tumo - Shiro - 代码审计

2.1、确定鉴权方式

翻阅项目的 pom.xml 文件以及 External Libraries 依赖库,观察到 Shiro 相关关键字。由此可确定,该项目采用 Shiro 进行鉴权

Java代码审计鉴权绕过
Java代码审计鉴权绕过
2.2、查看shiro配置

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

Java代码审计鉴权绕过

2.3、漏洞利用 

根据Shiro配置信息,寻找利用点,比如 /comment/** 是不需要鉴权的。全局搜索 "/comment" 相关的 Controller 文件,定位到 CommentController。测试删除评论,路由为 /comment/{id},提交方式为 DELETE

Java代码审计鉴权绕过
Java代码审计鉴权绕过

0x05 JWT 鉴权审计 - FastCMS

1、项目介绍 - FastCMS

FastCMS 基于 SpringBoot 进行插件式开发,拥有强大的扩展性。它不仅内置了一套完整的 CMS 建站系统,还支持博客、论坛、商城等多种功能。

下载链接:https://gitee.com/xjd2020/fastcms

2、JWT 鉴权漏洞审计思路

在 JWT 鉴权的审计过程中,像空加密和未校验签名这类情况较为罕见,通常出现在新手开发或运维的项目中。较为常见的漏洞风险主要集中在默认密钥未修改以及密钥存在被爆破的可能性。具体审计要点如下:

  • 生成时使用空加密
    :这属于逻辑代码层面的问题,若 JWT 生成时采用空加密,会使数据失去保护,存在极大安全隐患。
  • 服务端未校验签名
    :同样是逻辑代码问题,服务端若不对 JWT 进行签名校验,无法验证 token 的合法性与完整性,可能导致非法访问。
  • 密钥默认未被修改
    :项目搭建完成后,开发者如果未修改默认密钥,攻击者一旦知晓默认密钥,就能伪造合法 JWT 进行非法操作。
  • 密钥爆破可能性大
    :当密钥设置过于简单,比如长度较短、字符组合单一,攻击者可通过暴力破解手段获取密钥,进而伪造 JWT 突破鉴权机制。
3、FastCMS - JWT - 代码审计
  3.1、确定鉴权方式

        翻阅 pom.xml 和 External Libraries,观察到 JWT 相关 Dependency 信息。

Java代码审计鉴权绕过
Java代码审计鉴权绕过
jwt特征
Java代码审计鉴权绕过

3.2、审计流程

分析 JwtAuthTokenFilter,它主要执行了以下操作:

  1. JWT 令牌检查与认证信息设置
    :在请求到达控制器之前检查 JWT 令牌,并将令牌中的认证信息设置到 Spring Security。这一步是整个鉴权流程的基础,通过对 JWT 令牌的检查,获取其中包含的用户认证信息,并将其融入到 Spring Security 的认证体系中,为后续的权限判断提供依据。
  2. 身份验证需求判断
    :过滤器根据请求 URI 的前缀判断是否需要进行身份验证。不同的 URI 前缀可能对应着不同的业务功能和访问权限要求,通过这种方式可以灵活地确定哪些请求需要进行严格的身份验证,哪些请求可以允许匿名访问,提高系统的安全性和灵活性。
  3. 过滤器链执行与错误处理
    :如果需要验证且 JWT 令牌有效,它将继续执行过滤器链,让请求能够正常访问后续的资源;否则,它将返回相应的错误响应。当 JWT 令牌无效(如过期、签名错误等),或者请求本身不需要携带 JWT 令牌但却缺少有效令牌时,系统会返回对应的错误信息,阻止非法访问。
  4. Java代码审计鉴权绕过

    JWT 的验证到底有没有问题,关键就在于 tokenManager 的各个方法是否存在问题,于是跟踪到了 DelegatingTokenManager,检查其各个方法的代码,发现不存在空加密或未校验签名的问题。

    转而查看 application.yml,发现密钥 secret-key 为官方默认的,也就是说搭建后未修改过。

    3.4、漏洞利用

    利用默认密钥,生成管理员账户的 JWT(注意修改过期时间 exp)

    Java代码审计鉴权绕过

    BurpSuite 抓包修改 JWT 值,成功进入管理员后台

    Java代码审计鉴权绕过

原文始发于微信公众号(韭要学JAVA安全):Java代码审计鉴权绕过

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

发表评论

匿名网友 填写信息