Shiro简介
https://www.51cto.com/article/757560.html shiro的漏洞主要有两种分类
- RCE:反序列化 shiro550 shiro721
- 绕过权限控制进行访问
shiro基础
shiro的概念:是一个权限管理的框架,实现 用户认证、用户授权 。解决的问题:使用URL拦截的时候要对所有的URL都需要进行配置,繁琐,不易维护,我们可以使用Shiro实现系统的权限管理。 基础的概念:
SecurityManager
SecurityManager:安全管理器,是Java安全体系结构的一部分,负责对Java应用程序的运行时的环境进行安全控制和监管。
其中带有一些默认的过滤器
- anon:匿名过滤器
- authc:登录过滤器
在Java当中,安全管理器的主要作用是 限制应用程序对系统资源的访问,以保护系统免受恶意代码的攻击。
创建令牌,执行登录
//使用账户名和密码换取到 token
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
SecurityUtils.setSecurityManager(securityManager); // 注入SecurityManager
Subject subject = SecurityUtils.getSubject(); // 获取Subject单例对象
subject.login(token); // 登陆
- Subject:用户进行登录之后的数据会存储到session当中,主体的意思:系统需要对subject进行身份认证。当前线程中的用户所进行的认证和授权等等操作,都会以操作这个Subject对象来进行,类似于访问者在系统当中的抽象。是用户和shiro之间的桥梁,负责将用户的信息传递给shiro进行认证和授权。相当于个人用户的信息在系统的抽象
- SecurityManager:安全管理器,管理所有的subject
- Realm:安全数据源,用于认证和授权,其中包括 用户身份信息,角色信息,权限信息。作用:当用户登录或应用程序当中进行权限检查的时候,Realm从数据库当中获取相关的用户身份和权限的信息。相当于数据库的DAO
//获取相关的subject
Subject subject = SecurityUtils.getSubject();
//设置相关的user属性
User user = (User) subject.getSession().getAttribute("user");
通过令牌,项目,登录之间的关系,shiro保证了项目的安全。 Shiro的设计思路:用户和角色对应的关系是n-n,
- 首先根据用户名和密码判断登录的用户是否合法
- 再对合法的用户进行授权
Shiro的登录授权过程
- 首先在用户没有进行认证的时候访问一些资源,Shiro会生成一个Subject,这个Subject没有任何的用户信息。
- 当用户开始登陆,Shiro会调用Subject的login方法,对用户的用户名和密码进行校验
- 校验通过后,会生成一个新的Subject,后续用户的授权等操作,都会基于这个新生成的Subject
shiro漏洞
CVE-2010-3863
没对请求的路径做标准化的处理,导致设置 访问 /auth 需要认证,但是访问 /./auth 不需要进行认证
【空用户访问】CVE-2014-0074/Shiro-460
1.2.3 之前的Apache Shiro,当使用LDAP服务器启用无需身份验证即可绑定的功能的时候,允许攻击者以空用户名进行访问
ldapContextFactory = org.apache.shiro.realm.ldap.JndiLdapContextFactory
ldapContextFactory.url = ldap://abc.internal:389/
adRealm = org.apache.shiro.realm.activedirectory.ActiveDirectoryRealm
adRealm.ldapContextFactory = $ldapContextFactory
adRealm.searchBase = "CN=Configuration,DC=abc,DC=internal"
关键点是 ldap是可以配置匿名访问的,其可以使用控用户和任意密码进行登录,本质是LDAP的问题。 修复方法是: 检查登录的账户和用户
【RCE】CVE-2016-4437/Shiro-550
1.2.5之前,当没有设置“remember me”功能配置密钥的时候,可RCE或者通过请求参数绕过访问限制 。
在识别身份的时候,需要对cookie当中的 RemeberMe字段进行解密,
过程:cookie- base64解码 - AES解密【硬编码】-对数据进行反序列化
作为攻击者,我们可以构造恶意的代码,将其进行序列化- AES加密-base64编码,最后作为 cookie进行发送,则会执行恶意的代码
可以配合CC链路进行攻击
https://github.com/zhzyker/shiro-1.2.4-rce
修改的方式:其秘钥变为了每次启动都随机进行生成的数值
【绕过访问权限】CVE-2016-6802
1.3.2 之前,shiro允许攻击者绕过预期的servlet过滤器并通过利用 contextPath获取访问的权限。
非标准化处理所造成的结果
getPathWithinApplication 方法中的 getContextPath 没有进行标准化路径
访问 /abc 需要进行认证,那么访问 /../abc 可以绕过认证
getPathWithinApplication中 若 contextPath是 /shiro,当传递的uri是 /aaa/../shiro/abc
- getContextPath: /aaa/../shiro :生成 RequestURI的,而RequestURI是决定这个请求是否需要鉴权的,当我们生成畸形的ContextPath就可以绕过Apache Shiro的鉴权机制
- getRequesturi: /shiro/abc
getPathWithApplicatopn函数 会直接进行返回 /shiro/abc
https://www.cnblogs.com/backlion/p/14055279.html
【针对密码的填充攻击】CVE-2016-6802
Padding Oracle Attack
- Shiro < 1.4.2
padding Oracle
达成的目的:在没有秘钥的情况下进行加密或者进行解密密文
在加密通信中,填充:将明文数据扩展到加密算法块大小的倍数。在此攻击中,攻击者利用填充的响应信息来推断出加密算法中的加密秘钥。
允许攻击者通过填充信息的不同响应时间来确定身份验证过程当中的错误,通过不断尝试不同的填充方式,攻击者可以逐步推断出解密之后的明文,以及可以控制解密之后的明文为我们所想要的。
【RCE】CVE-2019-12422 Shiro-721
Shiro721,shiro通过 AES-128-CBC 对AES-128-CBC 对cookie当中的 remeberMe字段进行加密,所以用户可以通过Padding Oracle 加密生成的攻击代码来构造 恶意的 remeberMe的字段,用有效的 RemeberMe cookie 作为 Padding Oracle Attack的前缀。 原理是什么? 我们可以根据服务的响应来判断我们的输入IV是否是正确的