Shiro相关基础知识

article/2025/10/7 16:09:25

文章目录

  • 前言
  • 一、Shiro相关基础知识
    • 1.Shiro是什么
    • 2.Shiro具体功能
    • 3.Shiro的整体结构与重要组件
    • 4.Shiro各模块基础知识
      • 1)Authentication 认证模块
      • 2)Authorization 授权模块
      • 3)Realm 认证模块
    • 5.Shiro集成到web应用
  • 二、Shiro相关漏洞
    • 1. Shiro漏洞原理
    • 2. Shiro漏洞指纹
    • 3. Shiro漏洞汇总


前言

      以前的笔记,简单整理下。


一、Shiro相关基础知识

1.Shiro是什么

     1)Shiro是一个功能强且易用的java安全框架,具有身份验证、授权、加密和会话管理等功能。使用Shiro框架可以快速、轻松地安全构建任何应用程序,无论大小。

2.Shiro具体功能

     1)身份认证/登录,验证用户是不是拥有相应的身份
     2)用户访问权限控制验证,验证某个已认证的用户是否拥有某个权限,如:验证某个用户是否拥有某种角色权限或者验证某个用户对某个资源是否具有某个权限。
     3)会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中。在非 web 或 EJB 容器的环境下可以任意使用Session API。
     4)加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储。
     5)Web支持,可以非常容易的集成到Web环境。 Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率。
     6)shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去
     7)Remember Me(记住我)服务,获取用户关联信息而无需登录。
     8)启用单点登录(SSO)功能。
     9)等等。

3.Shiro的整体结构与重要组件

     1)Shiro详细架构流程如下所示:
在这里插入图片描述
      各模块功能简介:

模块名称作用
Subject正在与软件交互的一个特定的实体“view”(用户、第三方服务、时钟守护任务等)
SecurityManagerShiro的心脏,所有具体的交互都通过SecurityManager进行控制,负责所有Subject,且负责进行认证和授权、及会话、缓存的管理。
Authentication(认证)用户身份识别组件,身份验证的过程–也就是证明一个用户的真实身份。为了证明用户身份,需要提供系统理解和相信的身份信息和证据。需要通过向 Shiro 提供用户的身份(principals)和证明(credentials )来判定是否和系统所要求的匹配。
Authentication Strategy(认证策略)如果配置多个Realm,就需要设置前提条件,来确定用户身份验证的成功或失败
​Authorizer​(授权)用户访问控制组件,是管理资源访问的过程,换言之,也就是控制在一个程序中“谁”有权利访问“什么”。比如是否允许这个用户查看这个页面,编辑这个数据。授权有三个核心元素分别是权限(permissions)、角色(roles)和用户(users)。
Session Management(会话管理)创建并管理用户的 Session 会话生命周期
SessionDAO​SessionDAO 替 SessionManagement 执行 Session 持久化(CRUD)动作来管理session数据。
CacheManager(缓存控制器)CacheManager 为 Shiro 的其他组件提供创建缓存实例和管理缓存生命周期的功能。
Cryptography(加密)在对数据源使用加密算法加密的同时,保证易于使用
RealmsRealm 是可以访问程序特定的安全数据,如用户、角色、权限等的一个组件。是 shiro 和你的应用程序安全数据之间的“桥”或“连接”,用于进行权限信息的验证需自己实现。Realm 通常和数据源是一对一的对应关系,如关系数据库,LDAP 目录,文件系统等

     2)Shiro认证流程图如下所示:
在这里插入图片描述
      第1步:应用程序首先调用 Subject.login(token) 进行登录,其会自动委托给 Security Manager,调用之前必须通过 SecurityUtils.setSecurityManager() 设置。
      第2步:SecurityManager 负责真正的身份验证逻辑;它会委托给 Authenticator 进行身份验证。
      第3步:Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现。
      第4步:Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认 ModularRealmAuthenticator 会调用 AuthenticationStrategy 进行多 Realm 身份验证。
      第5步:Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回 / 抛出异常表示身份验证失败了。此处可以配置多个 Realm,将按照相应的顺序及策略进行访问。
     3)Shiro授权流程图如下所示:
在这里插入图片描述
     4)Shiro认证时序图如下所示:
在这里插入图片描述

4.Shiro各模块基础知识

1)Authentication 认证模块

     (1) shiro认证模块验证身份时需要提供用户的身份(principals)和证明(credentials )来判定是否和系统所要求的匹配。
     (2) Principals(身份信息) 是Subject的“标识属性”,就是登陆时的账号处需要填写的东西,如用户名、手机号、邮箱等任何与Subject相关的标识
     (3) Credentials(证明) 通常是只有 Subject 知道的机密内容,用来证明他们真正拥有所需的身份,就是登录时密码处需要填写的东西,如密码、指纹等。
     (4) Subject 验证的过程可以划分为以下三个步骤:

  • 收集 Subject 提交的身份和证明(就是账号密码)
  • 向 Authentication 提交身份和证明
  • 如果提交的内容正确,允许访问,否则重新尝试验证或阻止访问

2)Authorization 授权模块

     (1) 授权就是访问权限控制,就是管理资源访问的过程中谁有哪些权限可以访问哪些内容。
     (2) 授权有三个核心元素分别为:权限(permissions)、角色(roles)和用户(users)。
     (3) 权限是 Apache Shiro 中安全策略最基本的元素,它们是一组关于行为的基本指令,来显示在一个程序中什么可以做。权限设置最基础的思想是在资源和动作的基础上设置最小量的权限指令。需注意权限指令只描述行为(和资源相关的动作),并不关心"谁"有这个能力执行这个动作。
     权限指令的例子:

  • 打开一个文件
  • 删除"haha"用户
  • 查看"/user/list"页面

     (4) 角色是一个实体名,代表一组行为或职责,可以理解为用户角色或者管理员角色这种,不同的角色权限也不同。
     (5) 用户本质上是程序中的具体的一个名字,如admin用户、guest用户等。用户通过与角色或权限关联来确定你是否拥有程序内的某些特定动作行为,比如你是否有资格删除文件。
     例如,在你的数据模型中,你定义了一个普通的用户类并且直接为其设置了权限,或者你只是直接给角色设置了权限,然后将用户与该角色关联,通过这种关联,用户就“有”了角色所具备的权限,或者你也可以通过“组”的概念完成这件事,这取决于你程序的设计。

3)Realm 认证模块

     (1) Shiro 提供了多个 HashedCredentialsMatcher 子类,可以使用 SHA-265 方式加密用户的密码

5.Shiro集成到web应用

     1)将 Shiro 集成到任何 Web 应用程序的最简单的方法是在 web.xml 中配置 ContextListener 和 Filter。
     2)当运行一个 Web 应用程序时,Shiro 将会创建一些有用的默认 Filter 实例,并自动地在[main]项中将它们置为可用,可以在 main 中配置它们。
     3)shiro中的url路径匹配规则为:

/admin只匹配固定的URL,比如 http://xxx.com/admin,只能匹配到 http://xxx.com/admin
/admin?匹配一个字符,比如 http://xxx.com/admin?,将匹配“ /admin1”、“/admin2”,但不匹配“/admin”
/*匹配零个或多个字符串,比如 http://xxx.com/admin/*”,将匹配 /admin/路径下的任意内容 ,但是不匹配多个路径,如 http://xxx.com/admin/1/2就匹配不到
/**匹配路径中的零个或多个路径 ,比如http://xxx.com/admin/**,将匹配/admin/下级的所有路径中的内容,http://xxx.com/admin/xxxx/asd

二、Shiro相关漏洞

1. Shiro漏洞原理

     1)Shiro框架提供了记住我这个功能(RemeberMe),用户登陆成功后会生成一个经过加密的Cookie。其Cookie的Key的值为RememberMe,Value的值是先序列化,然后AES加密,最后Base64编码得到的结果。
     这个服务端解析cookie的正向流程是:检索RemeberMe cookie的值—>Base64解码—>AES解码—>反序列化。出现漏洞的原因是在反序列化时未进行任何过滤,所以导致会触发远程代码执行漏洞。需注意只要RemeberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞。
     2)我们已知正向流程了那么反向流程也就出来了为:恶意命令—>序列化—>AES加密—>base64编码—>发送Cookie。
     Shiro1.2.4版本之前AES的加密密钥为硬编码在代码中,其默认密钥的Base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,之后版本官方去掉了硬编码的密钥,通过每次随机生成一个密钥来解决反序列化漏洞。可通过各种途径搜索收集密钥然后爆破以提高对该漏洞的利用成功率。

2. Shiro漏洞指纹

请求包的cookie中存在rememberMe字段,可发送rememberMe=1等字段测试
查看响应包中是否存在set-Cookie: rememberMe=deleteMe 
URL中是否存在shiro字样
有时候服务器不会主动返回remeberMe=deleteMe,直接发包即可

3. Shiro漏洞汇总

     这里只列出了部分shiro漏洞,详细漏洞信息可以参考阿里云的漏洞库:https://avd.aliyun.com/search?q=shiro

名称描述
CVE-2016-4437Shiro rememberMe反序列化漏洞,影响版本:Shiro< 1.2.5
CVE-2016-6802身份验证绕过漏洞,在访问路径的前添加 /任意目录名/…/,即可绕过认证权限进行访问。影响版本:shrio <1.3.2
CVE-2020-1957Apache Shiro权限绕过,影响版本:Apache Shiro ≤ 1.5.2
CVE-2020-11989Apache Shiro权限绕过,影响版本:Apache Shiro ≤ 1.5.2
CVE-2020-13933Apache Shiro权限绕过,影响版本:Apache Shiro ≤ 1.5.3
CVE-2020-17510身份验证绕过漏洞,难以利用,影响版本:Apache Shiro < 1.7.0

http://chatgpt.dhexx.cn/article/sstJwRuY.shtml

相关文章

面试总结:Shiro框架

文章目录 Apache Shiro框架1. 简单介绍一下Shiro 框架2. Shiro 主要的四个组件3. Shiro 运行原理4. Shiro 的四种权限控制方式5. 授权实现的流程&#xff08;1&#xff09;、什么是粗颗粒和细颗粒权限&#xff1f;&#xff08;2&#xff09;、粗颗粒和细颗粒如何授权&#xff1…

shiro安全框架详解。面试必备

shiro核心就是过滤器。 认证授权流程&#xff1a; ● 认证&#xff1a;对用户的身份进行检查&#xff08;登录验证&#xff09; ● 授权&#xff1a;对用户的权限进行检查&#xff08;是否有对应的操作权限&#xff09; ● 流程图&#xff1a; 权限管理 实现权限的动态分配&a…

面试专题系列-Shiro

1.什么是shiro Apache Shiro 是 Java 的一个安全框架。使用 shiro 可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在 JavaSE环境&#xff0c;也可以用在 JavaEE 环境。Shiro 可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存等。 2.Sh…

shiro(详解)

这里写自定义目录标题 什么是shiro什么是权限管理什么是身份认证什么是授权SubjectSecurityManagerAuthenticatorAuthorizerRealmSessionManagerSessionDAOCacheManagerCryptography面试题认证的开发1. 创建项目并引入依赖2. 引入shiro配置文件并加入如下配置 自定义Realm自定义…

【JAVA面试题整理】框架之Shiro

一、简单介绍一下Shiro框架 Apache Shiro是java的一个安全框架。使用shiro可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE环境&#xff0c;也可以用在JavaEE环境。Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存等。 三…

shiro总结

shiro主要内容: 1:SecurityUtils shiro提供的工具类,主要作用是获取 SecurityManager和Subject public abstract class SecurityUtils {private static SecurityManager securityManager;//获取Subjectpublic static Subject getSubject() {Subject subject ThreadContext.…

Java面试系列总结 :Shiro

1. 简单介绍一下Shiro框架 Apache Shiro是Java的一个安全框架。使用shiro可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE环境&#xff0c;也可以用在JavaEE环境。Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存等。 三个…

Shiro知识总结二

3. 与 Spring Boot 整合 3.1 框架整合 依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>o…

Shiro相关知识

1、Shiro功能概述 Apache Shiro是一个功能强大且易于使用的 Java 安全框架&#xff0c;可执行身份验证、授权、加密和会话管理。 主要功能&#xff1a; Authentication&#xff1a;身份认证。登录时验证身份信息。 Authorization&#xff1a;授权操作。访问控制的过程&…

Spring、SpringMVC、Shiro面试题

Tags : JavaEE,Spring,面试题发表时间&#xff1a; 2014-11-29 15:03:53 原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 比如&#xff1a; 转自&#xff1a;Su的技术博客 原文地址&#xff…

Shiro知识总结一

1. 基础知识 1.1 什么是Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应…

Shiro总结面试问题

Shiro总结 Shiro可做哪些事&#xff1a; 认证、授权、加密、会话管理、与web集成、缓存等 最简单的Shiro应用是怎样运行的&#xff1a; 应用代码通过Subject来进行认证和授权&#xff0c;而Subject又委托给SecurityManager 我们需要给Shiro的SecurityManager注入Realm,从而让S…

python中socket进行多线程,利用 Socket怎么在Python项目中实现一个多线程并发功能...

利用 Socket怎么在Python项目中实现一个多线程并发功能 发布时间:2020-12-11 13:55:06 来源:亿速云 阅读:95 作者:Leah 这篇文章给大家介绍利用 Socket怎么在Python项目中实现一个多线程并发功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 1.S…

Jmeter多线程并发和压测结果分析

一、多线程并发 1. 线程组简介: (1). 线程数: 配置虚拟用户数量 (2). Ramp-Up时间:设置的虚拟用户数需要多长时间全部启动,如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。 (3). 循环次数 (4). 调度器-持续时间(秒),压测多长时间…

面试必问!多线程并发问题

多线程并发问题&#xff0c;基本是面试必问的。 大部分同学应该都知道Synchronized&#xff0c;Lock&#xff0c;部分同学能说到volatile、并发包&#xff0c;优秀的同学则能在前面的基础上&#xff0c;说出Synchronized、volatile的原理&#xff0c;以及并发包中常用的数据结…

实际场景中的多线程并发编程案例

目录 使用多线程的意义&#xff1a; CountDownLatch 案例一&#xff1a;多线程同步发起并发请求 案例二&#xff1a;rocketmq内&#xff0c;每个broker将自己注册到所有的nameserver时 案例三&#xff1a;利用异步线程实现同步请求 CompletableFuture 应用一&#xff1a…

【已解决】利用 Java 多线程并发编程提高数据处理效率

&#x1f389;工作场景中遇到这样一个需求&#xff1a;根据主机的 IP 地址联动更新其他模型的相关信息。需求很简单&#xff0c;只涉及一般的数据库联动查询以及更新操作&#xff0c;然而在编码实现过程中发现&#xff0c;由于主机的数量很多&#xff0c;导致循环遍历查询、更新…

c++ 多线程并发

基于C11的线程池(threadpool),简洁且可以带任意多的参数 - _Ong - 博客园 C11多线程编程(六)——线程池的实现 1. ① thread #include <iostream> #include <thread>class A { public:void operator()() {std::cout << "11111\n";} };int main…

python多线程并发请求

再api测试时&#xff0c;避免不了高并发的测试情况。所以以下案例为线程并发请求代码&#xff0c;以请求百度为例 #!/usr/bin/env python #!coding:utf-8 from __future__ import division from threading import Thread import requests import matplotlib.pyplot as plt imp…

多线程并发的一些解决思路

一、利用不变性解决并发问题 不变性&#xff08;Immutability&#xff09;模式。所谓不变性&#xff0c;简单来讲&#xff0c;就是对象一旦被创建之后&#xff0c;状态就不再发生变化。换句话说&#xff0c;就是变量一旦被赋值&#xff0c;就不允许修改了&#xff08;没有写操…