Java代码审计鉴权漏洞InterceptorFilterShiroJWT(非常详细!!)

目录

0x00 前言

0x01 鉴权方式&审计思路 

1、目前主流的鉴权方式

2、鉴权漏洞审计思路

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

1、项目介绍 - NewbeeMall

2、Interceptor 补充介绍

3、NewbeeMall - Interceptor鉴权 - 代码审计

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

1、项目介绍 - 华夏ERP

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

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

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

2、Tumo - Shiro - 代码审计

0x05 JWT鉴权审计 - FastCMS

1、项目介绍 - FastCMS

2、JWT鉴权漏洞审计思路

3、FastCMS - JWT - 代码审计


0x00 前言

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!  

个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser's Blog

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 补充介绍

参考:Spring Boot拦截器(Interceptor)详解

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

  • preHandle 方法:在请求处理之前被调用。当它返回 false 时,表示拦截请求,不继续执行后续处理器;当它返回为 true 时,表示放行请求,继续执行后续处理器
  • postHandle 方法:在 Controller 方法调用之后执行
  • 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,他们的配置如下,则其默认执行顺序为其注册顺序。当然,也可以使用 InterceptorRegistry#order(int) 方法指定执行顺序,值越小优先级越高。

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

3、NewbeeMall - Interceptor鉴权 - 代码审计

3.1、 确定鉴权方式

       翻阅 pom.xml 和 External Libraries,未观察到 Shiro、JWT 关键字,排除使用 Shiro、JWT 进行鉴权的可能。继续翻阅项目文件,观察到 interceptor 文件夹下有三个文件:AdminLoginInterceptor、NewBeeMallCartNumberInterceptor、NewBeeMallLoginInterceptor。继续搜索注册关键字 "registry.addInterceptor" 定位到 Interceptor 的配置文件 NeeBeeMallWebMvcConfigurer,最终确定该项目使用 Interceptor 进行鉴权。

3.2、AdminLoginInterceptor >> preHandle >> uri.startsWith

        分析 AdminLoginInterceptor 的 preHandle 方法,得知若请求的 URI 以 "/admin" 开头且 Session 中的 loginUser 属性为 null,则进行拦截。

3.3、漏洞利用

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

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

1、项目介绍 - 华夏ERP

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

核心框架为 SpringBoot 2.0.0,持久层框架为 Mybatis 1.3.2,日志管理为 Log4j 2.10.0

项目环境为:Mysql5.7+、JDK1.8、Maven3.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 进行鉴权。

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

分析 doFilter 方法,得出其放行和拦截的逻辑如下:

  • 检查用户是否已登录,如果已登录则放行
  • 放行登录页和注册页
  • 检查是否为忽略列表中的URL,如果是则放行
  • 检查是否为允许列表中的URL,如果是则放行
  • 否则,重定向到登录页

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

  • ignoredList << ignoredUrl = ".css#.js#.jpg#.png#.gif#.ico"
  • allowUrls << filterPath = "/user/login#/user/registerUser"

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
........

        BurpSuite抓包修改URI,成功在未登录情况下进入后台。

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 进行鉴权。

2.2、查看Shiro配置信息

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

2.3、漏洞利用 

        根据Shiro配置信息,寻找利用点,比如 /comment/** 是不需要鉴权的。全局搜索 "/comment" 相关的 Controller 文件,定位到 CommentController。

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

        删除前,数据库存储的评论如下:

        BurpSuite抓包修改提交方式为 DELETE,成功删除评论,如下:

0x05 JWT鉴权审计 - FastCMS

1、项目介绍 - FastCMS

FastCMS 基于 SpringBoot 进行插件式开发,具有极强的扩展性,内置一套完整的 CMS 建站系统,同时也支持博客,论坛,商城等功能。

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

2、JWT鉴权漏洞审计思路

一般来说,空加密和未校验签名很少见,除非是新手开发、运维,比较常见的是默认密钥未修改和密钥存在被爆破的可能。

  • 生成时使用空加密(逻辑代码问题)
  • 服务端未校验签名(逻辑代码问题)
  • 密钥默认未被修改(搭建后未修改)
  • 密钥爆破可能性大(密钥过于简单)

3、FastCMS - JWT - 代码审计

3.1、确定鉴权方式

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

        除此之外,BurpSuite 抓包也能看到很明显的 JWT 流量特征(eyJ)

3.2、审计流程

 分析 JwtAuthTokenFilter,它主要做了以下工作:

1、在请求到达控制器之前检查JWT令牌,并将令牌中的认证信息设置到Spring Security

2、过滤器根据请求URI的前缀判断是否需要进行身份验证。

3、如果需要验证且JWT令牌有效,它将继续执行过滤器链;否则,它将返回相应的错误响应。

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

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

3.3、漏洞利用 

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/272503.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostGIS学习教程十五:几何图形的有效性

PostGIS学习教程十五&#xff1a;几何图形的有效性 在90%的情况下&#xff0c;“为什么我的查询给了我一个’TopologyException’错误"的问题的答案是"一个或多个输入的几何图形是无效的”&#xff0c;这就引出了这样一个问题:几何图形"无效"是什么意思&a…

JAVA复习三——CH5 Java Collection 、CH6 MultiThread

CH5 Java Collection(集合) 5.1 Java集合框架&#xff08;位于java.util包中&#xff09; 图一 集合框架图 从上面的集合框架图可以看到&#xff0c;Java 集合框架主要包括两种类型的容器&#xff0c;一种是集合&#xff08;Collection&#xff09;&#xff0c;存储一个元素集…

pytest分布式执行插件 pytest-xdist 的高级用法

想要使用多个CPU核心来进行测试&#xff0c;可以使用 -n 参数( 或者 --numprocesses) (使用8个核心来跑测试用例) 1 pytest -n 8 使用 -n auto 参数可以利用电脑的所有核心来跑测试用例 测试时使用的算法可以根据--dist命令参数定制&#xff1a; --dist load(默认选项)&…

手拉手Springboot整合JWT

环境介绍 技术栈 springbootmybatis-plusmysqljava-jwt 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 Json Web令牌简称JWT Token是在服务端产生的一串字符串是客户端访问资源接口(AP)时所需要的资源凭证。…

【多省市译协盖章】2023年第九届中西部外语翻译大赛

“由中西部翻译协会共同体指导发起&#xff0c;各省市译协共建学术指导委员会&#xff0c;2023年第九届中西部外语翻译大赛由中西部翻译协会共同体秘书处&#xff08;武汉公仪网络科技有限公司&#xff09;承办。” &#xff08;证书样图&#xff09; 证书盖章单位&#xff1…

文件重命名:特殊符号影响你找文件吗?来看看这个解决方法

在日常生活和工作中&#xff0c;电脑已经成为必不可少的工具&#xff0c;而文件管理也是一项重要的任务。有时候遇到文件重命名的问题&#xff0c;例如当文件名中包含特殊符号时&#xff0c;这可能会给工作带来很大的困扰。当尝试寻找一个文件时&#xff0c;却发现因为文件名中…

Linux的账号及权限管理

一.管理用户账号 1.1 用户账户的分类 1.1.1 用户账号的分类 超级用户&#xff1a;&#xff08;拥有至高无上的权利&#xff09; root用户是Linux操作系统中默认的超级用户账号&#xff0c;对本主机拥有最高的权限&#xff0c;系统中超级用户是唯一的。普通用户&#xff1a; …

c++学习笔记(6)-类型转换

1、概念 C类型转换是将一种数据类型转换为另一种数据类型的过程。 2、分类 C中的类型转换可以从3个角度来划分&#xff1a; 根据类型转换是由程序员显式指定&#xff0c;还是由编译器自动完成&#xff0c;分为显式类型转换和隐式类型转换&#xff1b;根据参与类型转换的变量…

智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.减法平均算法4.实验参数设定5.算法结果6.…

测试用例要如何写

​ &#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试…

IDEA基本设置

本博客适用于纯新手小白&#xff0c;或者刚下载IDEA想要优化开发添加配置的读者。 基础设置 不区分大小写代码补全 打开 IntelliJ IDEA。转到 “File”&#xff08;文件&#xff09; > “Settings”&#xff08;设置&#xff09;&#xff08;Windows/Linux&#xff09;或 “…

swagger1.2 apiPost工具测试接口没有问题,换成swagger 接口调测时报错 Required request body is missing

把 请求方法由get换成post GetMapping换成 PostMapping 原因apiPost自动把请求json参数封装到请求体里了&#xff0c; 但swagger没有封装&#xff0c;通过networker可以看到载荷里并没有任何东西

(C++)DS哈希查找—二次探测再散列(附思路和详细注释)

Description 定义哈希函数为H(key) key%11。输入表长&#xff08;大于、等于11&#xff09;&#xff0c;输入关键字集合&#xff0c;用二次探测再散列构建哈希表&#xff0c;并查找给定关键字。 Input 测试数据组数 1≤&#xfffd;≤50. 每组测试数据格式如下&#xff1a…

面试题:Zabbix 和 Prometheus 到底怎么选?

文章目录 前言历史简介PrometheusZabbix 架构对比PrometheusZabbix 综合对比总结 前言 新公司要上监控&#xff0c;面试提到了 Prometheus 是公司需要的监控解决方案&#xff0c;我当然是选择跟风了。 之前主要做的是 Zabbix&#xff0c;既然公司需要 Prometheus&#xff0c;…

【如何破坏单例模式(详解)】

✅如何破坏单例模式 &#x1f4a1;典型解析✅拓展知识仓✅反射破坏单例✅反序列化破坏单例✅ObjectlnputStream ✅总结✅如何避免单例被破坏✅ 避免反射破坏单例✅ 避免反序列化破坏单例 &#x1f4a1;典型解析 单例模式主要是通过把一个类的构造方法私有化&#xff0c;来避免重…

鸿蒙系统的分布式技术:重塑智能终端的未来

华为鸿蒙系统自发布以来&#xff0c;凭借其创新的分布式技术&#xff0c;改变了我们对智能终端的认知和使用方式。鸿蒙系统的分布式技术是一种全新的设计理念&#xff0c;它将不同设备、不同应用场景视为一个整体&#xff0c;通过共享、协同和无缝连接&#xff0c;为用户带来前…

android setText不生效问题

1.直接说解决方案&#xff1a; 在代码没问题的情况下&#xff0c;将你的TextView的Id改一下&#xff0c;然后再重启编译器即可(注意&#xff0c;不修改TextView的ID&#xff0c;单独重启是没有作用的&#xff01;) 2.出现问题的过程&#xff1a; 产品新增一个需求&#xff0c…

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(一)登录认证

一、JWT简介 JWT 全称 JSON Web Token&#xff0c;JWT 主要用于用户登录鉴权&#xff0c;当用户登录之后&#xff0c;返回给前端一个Token&#xff0c;之后用户利用Token进行信息交互。 除了JWT认证之外&#xff0c;比较传统的还有Session认证&#xff0c;如何选择可以查看之前…

MAGVIT: Masked Generative Video Transformer

Paper name MAGVIT: Masked Generative Video Transformer Paper Reading Note Paper URL: https://arxiv.org/abs/2212.05199 Project URL: https://magvit.cs.cmu.edu/ Code URL: https://github.com/google-research/magvit TL;DR 2023 年 CMU、google 等发表 CVPR20…

[Python工程化之路] 搭建Python开发环境 包管理环境以及Linter

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 在工程化上,Python相比于Java,C#这类语言还是差了不少,不过整个生态还是不错的. 项目结构 一般有两种,一种称为flat另一种为src. ├── sample │ ├── AUTHORS.rst │ ├── docs | | ├── conf.py │ │ └…