apache shiro
ApacheShiro反序列化漏洞(Shiro-550CVE-2016-4437)

ApacheShiro反序列化漏洞(Shiro-550CVE-2016-4437)0x00 漏洞描述Apache Shiro是⼀款开源安全框架,提供⾝份验证、授权、密码学和会话管理。
Shiro框架直观、易⽤,同时也能提供健壮的安全性。
Apache Shiro 1.2.4及以前版本中,加密的⽤户信息序列化后存储在名为remember-me的Cookie中。
攻击者可以使⽤Shiro的默认密钥伪造⽤户Cookie,触发Java反序列化漏洞,进⽽在⽬标机器上执⾏任意命令只要rememberMe的AES加密密钥泄露,⽆论shiro是什么版本都会导致反序列化漏洞。
0x01 影响版本Apache Shiro <= 1.2.40x02 漏洞原理Apache Shiro框架提供了记住我的功能(RememberMe),关闭了浏览器下次再打开时还是能记住你是谁,下次访问时⽆需再登录即可访问。
⽤户登陆成功后会⽣成经过加密并编码的cookie。
Apache Shiro 1.2.4及以前版本中,Apache Shiro默认使⽤了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。
然⽽AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞在服务端接收cookie值时,按照如下步骤来解析处理:1、检索RememberMe cookie 的值2、Base 64解码3、使⽤AES解密(加密密钥硬编码)4、进⾏反序列化操作(未作过滤处理)但是,AES加密的密钥Key被硬编码在代码⾥,意味着每个⼈通过源代码都能拿到AES加密的密钥。
因此,攻击者构造⼀个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。
Shiro将rememberMe进⾏解密并且反序列化,最终造成反序列化漏洞。
Shiro权限管理框架(一):Shiro的基本使用

Shiro权限管理框架(⼀):Shiro的基本使⽤shiro概念:Apache Shiro是⼀个强⼤且易⽤的Java安全框架,执⾏⾝份验证、授权、密码和会话管理。
使⽤Shiro的易于理解的API,您可以快速、轻松地获得任何应⽤程序,从最⼩的移动应⽤程序到最⼤的⽹络和企业应⽤程序。
上⾯这段话来⾃百度百科,没啥⽤。
想要快速理解并使⽤Shiro要先从最重要的三⼤概念⼊⼿。
1. Subject:⼤⽩话来讲就是⽤户(当然并不⼀定是⽤户,也可以指和当前应⽤交互的任何对象),我们在进⾏授权鉴权的所有操作都是围绕Subject(⽤户)展开的,在当前应⽤的任何地⽅都可以通过SecurityUtils的静态⽅法getSubject()轻松的拿到当前认证(登录)的⽤户。
2. SecurityManager:安全管理器,Shiro中最核⼼的组件,它管理着当前应⽤中所有的安全操作,包括Subject(⽤户),我们围绕Subject展开的所有操作都需要与SecurityManager进⾏交互。
可以理解为SpringMVC中的前端控制器。
3. Realms:字⾯意思为领域,Shiro在进⾏权限操作时,需要从Realms中获取安全数据,也就是⽤户以及⽤户的⾓⾊和权限。
配置Shiro,我们⾄少需要配置⼀个Realms,⽤于⽤户的认证和授权。
通常我们的⾓⾊及权限信息都是存放在数据库中,所以Realms也可以算是⼀个权限相关的Dao层,SecurityManager在进⾏鉴权时会从Realms中获取权限信息。
这三个基本的概念简答理解后就可以开始配置和使⽤Shiro了,其实Shiro最基本的使⽤⾮常简单,加⼊依赖后只需要配置两个Bean,再继承⼀个抽象类实现两个⽅法即可。
基本使⽤:引⼊⼀个依赖新建⼀个基于Springboot的Web项⽬,引⼊Shiro依赖。
<!-- https:///artifact/org.apache.shiro/shiro-web --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version></dependency>配置两个Bean新建⼀个Shiro配置类,配置Shiro最为核⼼的安全管理器SecurityManager。
Java中的安全框架有哪些

Java中的安全框架有哪些Java作为一种广泛应用的编程语言,为了保障软件系统的安全性,在其开发过程中广泛采用了各种安全框架。
这些安全框架旨在提供认证、授权、数据保护等功能,以确保系统的机密性、完整性和可用性。
本文将介绍一些常用的Java安全框架。
一、Spring SecuritySpring Security是一款基于Spring框架的开源安全框架。
它提供了一个可插拔的、高度可定制的框架,用于在Java应用程序中进行身份验证和授权。
Spring Security可以与Spring框架无缝集成,通过使用注解或配置文件的方式来定义安全规则,具有较高的灵活性和易用性。
其提供的功能包括用户认证、权限管理、Web应用程序防护等。
二、Apache ShiroApache Shiro是另一款流行的Java安全框架。
它提供了简单易用的API,用于进行身份验证、授权、加密、会话管理等安全操作。
Shiro内嵌了常见的安全概念和算法,可轻松应对常见的安全需求。
它还支持与各种Java框架的集成,并且能够与Spring等框架无缝衔接。
Apache Shiro在安全性能和易用性方面都表现出色,因此被广泛应用于企业级应用开发。
三、Java Authentication and Authorization Service(JAAS)JAAS是Java平台的官方安全框架,用于提供认证和授权服务。
它建立在Java的安全模型上,支持多种身份验证方式(包括用户名/密码、数字证书等),并提供了灵活的权限管理机制。
JAAS允许开发人员通过配置文件或使用API来定义认证和授权策略,可以方便地与Java应用程序集成。
但相对而言,JAAS的学习曲线较陡峭,一些功能的配置和使用相对复杂。
四、Java Cryptography Extension(JCE)JCE是Java平台提供的一组用于加密和解密的API,用于保护数据的安全性和完整性。
JCE提供了各种加密算法和密码技术的实现,包括对称加密算法、非对称加密算法和哈希算法等。
ApacheShiro系列漏洞利用以及实战总结

ApacheShiro系列漏洞利用以及实战总结在使用 Apache Shiro 进行开发时,可能会出现一些漏洞,这些漏洞可能会被攻击者利用来绕过认证、越权访问、执行任意代码等。
下面是一些常见的 Apache Shiro 漏洞以及相应的利用方式。
1. Apache Shiro 反序列化漏洞这是 Apache Shiro 最常见的漏洞之一,攻击者可以通过构造恶意的序列化对象来执行任意代码。
利用这个漏洞的一种方式是构造一个带有恶意代码的序列化对象,并将其提交到 Apache Shiro 的身份认证接口,当应用程序尝试对该对象进行反序列化时,恶意代码会被执行。
2. Apache Shiro 权限绕过漏洞在 Apache Shiro 中,权限是通过权限字符串进行管理的,每个权限都有一个唯一的标识符。
攻击者可以通过修改请求参数的方式来绕过权限检查,例如在 URL 或请求头中添加一个不存在的权限字符串,从而获取未授权的资源。
3. Apache Shiro 会话固定漏洞Apache Shiro 使用会话管理来跟踪用户的状态和身份。
攻击者可以通过固定会话ID的方式来劫持用户的会话,从而冒充用户进行非法操作。
这可以通过将固定的会话ID设置为Cookie或URL参数的方式实现。
以上是一些常见的 Apache Shiro 漏洞和对应的利用方式。
为了保护应用程序免受这些漏洞的影响,可以采取以下措施:1. 及时更新 Apache Shiro 版本2.序列化对象的安全性处理确保只接受可信的序列化对象,并限制反序列化操作的范围。
可以使用一些安全的序列化库,如 Java 6+ 内置的 `java.util.util.Base64`。
同时,对于接收到的序列化对象,需要进行严格的输入验证和过滤。
3.严格验证权限对于用户的请求,需要进行严格的权限验证,确保只有具备相应权限的用户才能进行对应操作。
可以在请求处理器中添加权限验证的逻辑,拒绝未授权的操作。
ApacheShiro的作用和使用方式

ApacheShiro的作用和使用方式Apache Shiro的作用和使用方式Apache Shiro是一个功能强大且易于使用的Java安全框架,旨在为应用程序提供身份验证、授权、加密和会话管理等安全功能。
本文将介绍Apache Shiro的作用以及使用方式,并帮助读者更好地理解和应用该框架。
作用:1. 身份验证(Authentication):Apache Shiro提供了多种身份验证机制,包括基于表单的身份验证、基于LDAP的身份验证和基于数据库的身份验证等。
通过使用Shiro的身份验证功能,应用程序可以验证用户的身份,并确保只有经过身份验证的用户才能访问受保护的资源。
2. 授权(Authorization):Apache Shiro支持基于角色和权限的访问控制。
通过定义角色和权限,应用程序可以根据用户的身份和权限限制其对资源的访问。
Shiro还提供了基于注解的授权功能,可以方便地在代码中标注需要授权的方法或类。
3. 加密(Cryptography):Apache Shiro提供了密码加密和解密的功能,可以帮助应用程序保护用户的密码和敏感信息。
Shiro支持常用的加密算法,如MD5、SHA和AES等,开发者可以根据需求选择合适的加密方式。
4. 会话管理(Session Management):Apache Shiro可以有效地管理用户会话,包括会话的创建、维护和销毁。
Shiro支持将会话存储在内存中、数据库中或持久化到文件系统中,并且提供了集群会话管理的解决方案,可用于多台服务器的分布式应用程序。
使用方式:1. 引入依赖:在项目的构建文件中,添加Apache Shiro的依赖项。
如果使用Maven进行项目管理,可以在pom.xml文件中添加以下依赖:```xml<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.7.1</version></dependency>```2. 配置文件:创建一个名为shiro.ini的配置文件,其中包含了应用程序需要的安全配置信息,如身份验证器、授权器和加密器等。
apache shiro rememberme反序列化规则

apache shiro rememberme反序列化规则Apache Shiro是一个强大的、灵活的安全框架,它允许认证、授权、加密和会话管理。
在Shiro中,"RememberMe"功能允许用户在关闭浏览器后仍然保持登录状态。
然而,如果未正确配置"RememberMe",则可能会出现安全问题,如"反序列化攻击"。
这是因为"RememberMe"功能通常涉及到将用户会话数据序列化并存储在客户端(如cookie),然后在用户下次访问时进行反序列化。
如果攻击者能够修改存储在客户端的数据,他们可能会进行恶意操作,例如将一个已登录的用户会话转移到另一个用户。
为了防止这种攻击,你需要确保以下几点:1. 使用安全的序列化机制:默认情况下,Shiro使用Java的序列化机制。
然而,Java序列化不是安全的,因为它不验证发送方的身份。
为了安全起见,你应该使用一个安全的序列化机制,如JSON或加密的二进制格式。
2. 使用安全的加密:为了确保存储的数据在传输过程中不被篡改,你应该使用安全的加密算法对数据进行加密。
3. 验证数据的完整性:在反序列化数据之前,你应该验证数据的完整性。
如果数据被篡改,你应该拒绝反序列化并使用户登出。
4. 使用HTTP Only Cookies:为了防止通过JavaScript访问存储在cookie中的数据,你应该设置cookie的HTTP Only属性。
这样,只有服务器可以访问cookie 数据,从而防止了攻击者通过客户端脚本修改cookie。
5. 确保密钥的安全性:对于任何加密或哈希操作,你都应该使用强密钥。
如果攻击者获得了密钥,他们可能会解密或伪造数据。
6. 限制RememberMe的会话超时时间:不要让RememberMe会话无限期地持续下去。
设置一个合理的超时时间可以减少长时间未活动的会话被劫持的风险。
shiro requiresroles用法
shiro requiresroles用法shiro requiresRoles是一个Apache Shiro权限管理框架中的注解,用于标记需要特定角色才能访问的方法或类。
可以通过在方法或类的上方添加@RequiresRoles("role1,role2,...")的注解来指定所需的角色。
用法示例:1. 在方法上使用requiresRoles注解:```java@RequiresRoles("admin")public void deleteUser(String username) {// 删除用户的相关操作}```上面的示例表示只有具有"admin"角色的用户才能执行deleteUser方法。
2. 在类上使用requiresRoles注解:```java@RequiresRoles("admin")public class AdminController {// 管理员用户的相关操作}```这个示例表示只有具有"admin"角色的用户才能访问AdminController类中的方法。
3. 同时需要多个角色:```java@RequiresRoles({"admin", "manager"})public void createProduct(Product product) {// 创建产品的相关操作}```这个示例表示只有同时具有"admin"和"manager"角色的用户才能执行createProduct方法。
需要注意的是,requiresRoles注解只作用于方法和类,不会对方法内部的代码进行安全验证。
如果需要对方法内部的代码进行权限验证,可以使用其他的shiro注解,比如@RequiresPermissions。
常用的认证框架
常用的认证框架
常用的认证框架有:
1. Spring Security:基于Spring框架的安全认证框架,提供了丰富的认证和授权功能,并支持多种认证方式,如表单验证、基本认证、OAuth2等。
2. Apache Shiro:一个灵活且易于使用的Java安全框架,提供了身份认证和授权功能,支持多种认证方式,并且可以与其他框架无缝集成。
3. OAuth2:一个开放标准的授权框架,用于用户在第三方应用程序上授权访问受保护资源,常用于实现单点登录和API
访问授权。
4. JWT(JSON Web Token):一种轻量级的身份认证和授权机制,基于JSON数据格式和数字签名,通常用于跨域认证和授权。
5. CAS(Central Authentication Service):一个开源的单点登录认证系统,提供了统一的登录接口和票据管理,可实现用户在多个应用程序之间的无缝切换。
6. Keycloak:一个开源的身份和访问管理解决方案,提供了认证、授权等功能,并支持单点登录、社交登录等特性。
7. Okta:一个云身份和访问管理提供商,提供了全面的身份认
证和授权服务,可用于构建安全的应用程序和保护用户数据。
这些认证框架在开发中被广泛使用,并且提供了丰富的功能和易于集成,能够帮助开发者快速实现安全认证和授权功能。
shiro反序列化payload产生的过程
Apache Shiro是一个用于身份验证、授权和加密的Java安全框架。
在过去,Shiro框架曾存在一些反序列化漏洞,这些漏洞可被恶意利用。
当攻击者成功利用反序列化漏洞时,他们可以执行任意代码,这可能导致严重的安全问题。
在一般的反序列化攻击中,攻击者会构造精心设计的序列化payload,以便在传递给受影响的应用程序时执行恶意代码。
下面是一个简化的Shiro反序列化攻击过程:1. Shiro框架的使用:应用程序使用Shiro框架实现身份验证和授权功能。
Shiro通常会在会话(Session)管理中使用Java对象进行序列化和反序列化,其中包括与用户相关的身份验证和授权信息。
2. 序列化对象构造:攻击者构造一个精心设计的序列化payload,以便在反序列化时触发恶意代码的执行。
这通常涉及到构建一个恶意的Java对象图,其中包含特殊的类和方法,以在反序列化时执行攻击者的代码。
3. Payload注入:攻击者将构造的序列化payload注入到Shiro框架使用的会话数据中,通常是通过HTTP请求或其他与应用程序交互的通道。
4. 反序列化触发:Shiro框架在处理会话时尝试反序列化受感染的数据。
由于存在漏洞,Shiro可能会调用恶意构造的对象图中的方法。
5. 恶意代码执行:恶意代码在反序列化时执行,攻击者可以在此时执行任意操作,包括远程命令执行、文件系统访问等。
防范措施:-及时更新Shiro框架版本,以确保已修复已知的反序列化漏洞。
-仅允许信任的数据进行反序列化。
-考虑使用安全的序列化替代品,如JSON或XML,而不是Java原生序列化。
-避免将不可信数据存储在会话中,特别是在Shiro框架中。
请注意,反序列化攻击是一种严重的安全威胁,因此开发人员和系统管理员应当密切关注应用程序中使用的框架和库,及时更新以修复已知的安全漏洞。
Apache_Shiro开发文档
Apache Shiro Reference DocumentationIntroduction to Apache ShiroWhat is Apache Shiro?Apache Shiro是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。
Apache Shiro的首要目标是易于使用和理解。
安全有时候是很复杂的,甚至是痛苦的,但它没有必要这样。
框架应该尽可能掩盖复杂的地方,露出一个干净而直观的API,来简化开发人员在使他们的应用程序安全上的努力。
以下是你可以用Apache Shiro所做的事情:∙验证用户来核实他们的身份∙对用户执行访问控制,如:∙判断用户是否被分配了一个确定的安全角色∙判断用户是否被允许做某事∙在任何环境下使用Session API,即使没有Web或EJB容器。
∙在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。
∙聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。
∙启用单点登录(SSO)功能。
∙为没有关联到登录的用户启用"Remember Me"服务…以及更多——全部集成到紧密结合的易于使用的API中。
Shiro视图在所有应用程序环境下实现这些目标——从最简单的命令行应用程序到最大的企业应用,不强制依赖其他第三方框架,容器,或应用服务器。
当然,该项目的目标是尽可能地融入到这些环境,但它能够在任何环境下立即可用。
Apache Shiro FeaturesApache Shiro是一个拥有许多功能的综合性的程序安全框架。
下面的图表展示了Shiro的重点,并且这个参考手册也会与之类似的被组织起来:Shiro把Shiro开发团队称为“应用程序的四大基石”——身份验证,授权,会话管理和加密作为其目标。
∙Authentication:有时也简称为“登录”,这是一个证明用户是他们所说的他们是谁的行为。
∙Authorization:访问控制的过程,也就是绝对“谁”去访问“什么”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Apache Shiro介绍
一、Apache Shiro是什么?
Apache Shiro一个功能强大,使用简单的Java安全框
架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案。
二、Apache Shiro应用
1)在/WEB-INFO/LIB/下添加jar包
2)配置web.xml,添加过滤器
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>
org.apache.shiro.web.servlet.IniShiroFilter
</filter-class>
<!-- 没有init-param属性就表示从classpath:shiro.ini装入INI配置-->
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3)配置shiro.ini
#下面是用户名=密码,登录类型
# format: username = password, role1, role2, ..., roleN
[users]
admin = 123 , admin , member
member = 123 ,member
user = 123 ,user
# format; roleName = permission1, permission2, ..., permissionN
[roles]
admin = *
member = view:*
user= winnebago:drive:eagle5
三、Java部分
1.装入INI配置
Factory<SecurityManager> factory = new
IniSecurityManagerFactory("classpath:shiro.ini");
2.创建SecurityManager
SecurityManager securityManager =
factory.getInstance();
3.使其可访问
SecurityUtils.setSecurityManager(securityManager);
4.通过这种方式获取当前用户
Subject currentUser = SecurityUtils.getSubject();
5.获取Session对象
session session = currentUser.getSession()
session.setAttribute( "someKey", "aValue );
6.接受提交的当事人和证书
UsernamePasswordToken token = new
UsernamePasswordToken( username , passsword );
token.setRememberMe(true);
7.登录
currentUser.login(token);
8. 登录失败, 通过捕获各类异常,根据不同类型的异
常做出不同的处理:
try {
currentUser.login( token );
} catch ( UnknownAccountException uae ) {
…
} catch ( IncorrectCredentialsException ice) {
…
} catch ( LockedAccountException lae ) {
…
}
... more types exceptions to check if you want ...
} catch ( AuthenticationException ae ) {
…
}
9. 判断用户是否拥有特定的角色
if ( currentUser.hasRole( "permission1" ) ) {
("May the permission1 be with you!" );
} else {
( "Hello, mere mortal." );
}
10. 判断用户是否对特定某实体有操作权限
if ( currentUser.isPermitted( "view:* " ) ) {
("You may use a view ring. Use it wisely.");
} else {
("Sorry, view rings are for member masters only.");
}
11. 判断用户是否有访问特定类型实例的权限
if( currentUser.isPermitted( "winnebago:drive:eagle5" ) {("You are permitted to 'drive' the 'winnebago' with license plate (id) 'eagle5'. " +"Here are the keys - have fun!");
} else {
("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
}
12. 当用户使用完毕,还可以退出应用
currentUser.logout();
System.exit(0);。