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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值