皮皮网
皮皮网

【php fpm源码分析】【星娱币源码】【debian安装内 源码】shiro源码解读

来源:obs 录屏 源码分析 发表时间:2024-12-29 02:12:50

1.Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的码解Session共享
2.Shiro反序列化漏洞原理详解及复现
3.<shiro:haspermission name="user:create"> user代表啥
4.shiro反序列化漏洞原理分析以及漏洞复现(Shiro-550/Shiro-721漏洞复现)
5.Shiro源码分析---FilterChain创建过程

shiro源码解读

Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享

       Shiro权限管理框架第二篇深入讲解了如何结合Redis实现分布式环境下的Session共享。在集群环境中,码解单台服务器已无法满足高并发访问的码解需求,需要部署集群服务器以分担压力。码解然而,码解随着集群服务器的码解php fpm源码分析引入,如何在不同服务器间保持用户会话状态成为了一个挑战。码解

       在无状态的码解HTTP协议下,通过Session和Cookie机制可以实现用户状态的码解持久化。用户在首次访问服务器时,码解服务器为其创建Session,码解并将唯一SessionId存储在Cookie中,码解以便在后续请求中识别用户。码解但随着集群环境的码解使用,同一用户在不同服务器间的码解Session无法共享,导致用户需要在每个服务器重新登录,这显然无法提供良好的用户体验。

       为了解决这个问题,通常有两种方式:一是将用户请求固定到某一台服务器,通过IP算法或其他机制实现负载均衡。二是将所有服务器的Session进行共享,使得任何一台服务器都能访问到其他服务器的Session,确保用户在不同服务器间的连续性。Shiro结合Redis实现分布式Session共享,正是基于后一种策略。

       通过继承Shiro的AbstractSessionDAO类,开发者可以轻松实现Session的增删改查操作,结合Redis作为分布式存储,星娱币源码可以高效地实现Session的分布式共享。Shiro框架本身已经封装了大部分流程,开发者只需关注具体的业务实现和配置,从而简化了复杂性。

       实现过程包括自定义RedisSessionDAO、注入SessionManager、配置Shiro安全管理器等步骤,确保所有服务器间Session的一致性和可访问性。测试环节验证了分布式Session共享的正确性,确保了用户在不同服务器间登录状态的一致性。

       基于Redis实现的Session共享,不仅简化了开发过程,而且提高了系统的扩展性和可用性。Shiro框架的使用,使得在不深入源码的情况下,即可实现强大的功能,这体现了框架设计的优秀性和实用性。然而,对于深入理解框架内部工作原理和机制,以提升开发者的编程能力和系统理解,同样重要。因此,深入Shiro源码的探索,将有助于开发者更全面地掌握这一框架的精髓。

       通过Shiro结合Redis实现的分布式Session共享,不仅解决了集群环境下的用户会话一致性问题,还展示了框架设计如何通过抽象和封装,debian安装内 源码将复杂的系统设计简化为易于理解和使用的API,为开发者提供了高效解决问题的工具。这一过程不仅提高了开发效率,还促进了对框架核心机制的深入理解,为未来的项目开发和维护打下了坚实的基础。

Shiro反序列化漏洞原理详解及复现

       要进行Shiro反序列化漏洞的探究,首先需要搭建一个vulhub提供的Shiro环境,通过访问端口进行测试确认。

       Shiro是个开源的安全框架,核心功能包括身份验证、授权和会话管理。当我们尝试登录并勾选"Remember me"选项,Burp抓包会发现响应包中的set-cookie字段包含'rememberMe'。如果不勾选,set-cookie则会设置为'rememberMe=deleteMe',这成为判断网站是否使用Shiro和是否存在漏洞的线索。

       虽然不深入分析源码,但服务端在处理cookie时,会经历一系列操作,包括读取、处理和存储。这个过程中的一个环节,URLDNS链可以被利用,从HashMap的readObject方法开始,通过一系列转换最终发送DNS解析请求。利用ysoserial工具生成URLDNS链,然后对特定payload进行加密和编码,手机答题系统源码隐藏JSESSIONID并修改rememberMe字段。

       通过这种方式发送请求,DNS日志会显示成功,表明存在可利用的漏洞。进一步,可以尝试生成CC链,利用它执行反弹shell攻击,但需要注意,vulhub靶机可能缺少nc工具,需要先进行上传。

       关于Shiro的不同版本,1.4.2版本之前的使用CBC加密,虽然密钥不再硬编码,可以通过padding oracle攻击,但1.4.2及以后的版本切换到了GCM加密,这为防御带来了变化,需要在实际环境中考虑相应的防护措施。

<shiro:haspermission name="user:create"> user代表啥

       è¿™ä¸ªæ˜¯é¡¹ç›®è‡ªèº«çš„规则,但是我们习惯用这样的。一般都是前面的是业务或者角色,代表这个业务下的某一项功能。也就是 创建用户。

       æŽ¨èä¸€å¥—完整的Shiro Demo,免费的。

Shiro介绍文档:/shiro

       Demo已经部署到线上,地址是 如果密码错误,请用sojson。PS:你可以注册自己的帐号,然后用管理员赋权限给你自己的帐号,但是,每分钟会把数据初始化一次。建议自己下载源码,让Demo跑起来,然后跑的更快。

shiro反序列化漏洞原理分析以及漏洞复现(Shiro-/Shiro-漏洞复现)

       shiro-反序列化漏洞(CVE--)漏洞简介

       shiro-主要是由shiro的rememberMe内容反序列化导致的命令执行漏洞,造成的原因是默认加密密钥是硬编码在shiro源码中,任何有权访问源代码的人都可以知道默认加密密钥。于是攻击者可以创建一个恶意对象,对其进行序列化、编码,然后将其作为cookie的rememberMe字段内容发送,Shiro 将对其解码和反序列化,导致服务器运行一些恶意代码。

       特征:cookie中含有rememberMe字段

       修复建议:

       更新shiro到1.2.4以上的个人网店商城源码版本。

       不使用默认的加密密钥,改为随机生成密钥。

       漏洞原理

       一、Shiro简介

       Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务。

       在ApacheShiro<=1.2.4版本中AES加密时采用的key是硬编码在代码中的,于是我们就可以构造Remembe Me的值,然后让其反序列化执行。

       二、Shiro服务器识别身份加解密处理的流程

       (1)加密

       1.用户使用账号密码进行登录,并勾选"Remember Me"。

       2、Shiro验证用户登录信息,通过后,查看用户是否勾选了”Remember Me“。

       3、若勾选,则将用户身份序列化,并将序列化后的内容进行AES加密,再使用base编码。

       4、最后将处理好的内容放于cookie中的rememberMe字段。

       (2)解密

       1、当服务端收到来自未经身份验证的用户的请求时,会在客户端发送请求中的cookie中获取rememberMe字段内容。

       2、将获取到的rememberMe字段进行base解码,再使用AES解密。

       3、最后将解密的内容进行反序列化,获取到用户身份。

       三、Key

       AES加密的密钥Key被硬编码在代码里

       于是可得到Payload的构造流程:

       恶意命令-->序列化-->AES加密-->base编码-->发送Cookie

       Shiro-反序列化漏洞(CVE--)Shiro和Shiro的区别是什么

       Shiro只需要通过碰撞key,爆破出来密钥,就可以进行利用 Shiro的ase加密的key一般情况下猜不到,是系统随机生成的,并且当存在有效的用户信息时才会进入下一阶段的流程所以我们需要使用登录后的rememberMe Cookie,才可以进行下一步攻击。

       漏洞指纹

       URL中含有Shiro字段

       cookie中含有rememberMe字段

       返回包中含有rememberMe

       漏洞介绍

       在Shiro中,Shiro通过AES--CBC对cookie中的rememberMe字段进行加密,所以用户可以通过PaddingOracle加密生成的攻击代码来构造恶意的rememberMe字段,进行反序列化攻击,需要执行的命令越复杂,生成payload需要的时间就越长。

       漏洞原理

       由于Apache Shiro cookie中通过 AES--CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,用有效的RememberMe cookie作为Padding Oracle Attack 的前缀,然后制作精心制作的RememberMe来执行Java反序列化攻击

       攻击流程

       登录网站,并从cookie中获取RememberMe。使用RememberMe cookie作为Padding Oracle Attack的前缀。加密syserial的序列化有效负载,以通过Padding Oracle Attack制作精心制作的RememberMe。请求带有新的RememberMe cookie的网站,以执行反序列化攻击。攻击者无需知道RememberMe加密的密码密钥。

       加密方式:AES--CBC 属于AES加密算法的CBC模式,使用位数据块为一组进行加密解密,即字节明文,对应字节密文,,明文加密时,如果数据不够字节,则会将数据补全剩余字节

       若最后剩余的明文不够字节,需要进行填充,通常采用PKCS7进行填充。比如最后缺3个字节,则填充3个字节的0x;若最后缺个字节,则填充个字节的0;

       若明文正好是个字节的整数倍,最后要再加入一个字节0x的组再进行加密

       Padding Oracle Attack原理 Padding Oracle攻击可以在没有密钥的情况下加密或解密密文

       Shiro Padding Oracle Attack(Shiro填充Oracle攻击)是一种针对Apache Shiro身份验证框架的安全漏洞攻击。Apache Shiro是Java应用程序中广泛使用的身份验证和授权框架,用于管理用户会话、权限验证等功能。

       Padding Oracle Attack(填充Oracle攻击)是一种针对加密算法使用填充的安全漏洞攻击。在加密通信中,填充用于将明文数据扩展到加密算法块大小的倍数。在此攻击中,攻击者利用填充的响应信息来推断出加密算法中的秘密信息。

       Shiro Padding Oracle Attack利用了Shiro框架中的身份验证过程中的一个漏洞,该漏洞允许攻击者通过填充信息的不同响应时间来确定身份验证过程中的错误。通过不断尝试不同的填充方式,攻击者可以逐步推断出加密秘钥,并最终获取访问权限。

       这种攻击利用了填充错误的身份验证响应来获取关于秘密信息的信息泄漏,然后根据这些信息进行进一步的攻击。为了防止Shiro Padding Oracle Attack,建议及时更新Apache Shiro版本,确保已修复该漏洞,并采取其他安全措施,如使用安全的加密算法和密钥管理策略。

       漏洞复现:CVE--

       环境:kali linux

       靶场使用:vulhub/shiro/CVE--

       访问地址:

       抓包分析一下:

       在返回包当中发现存在rememberMe=deleteMe 字样,可以大概确定有配置shiro,可以进行下一步。因为shiro本身功能就是一个身份验证管理,所以一般都在登录口可以看到。

       UI一键利用工具

       使用工具再进行检测确认:

       输入目标的url地址,根据关键字进行爆破秘钥

       接下来爆破利用链以及回显方式:

       接下来可进行命令执行:

       反弹shell:

       可使用工具进行检测:

       检测完成后可进行命令执行,反弹shell等操作:

       使用工具进行简单的反弹:

       设置监听端口

       window:

       linux:

       还有使用ysoserial监听模块JRMP来进行反弹shell,具体可看参考文档,操作都差不多。

       正是因为利用简单,所以危害比较大。

       工具地址

       漏洞复现:CVE--

       环境:kali linux

       docker进行搭建启动

       访问:

       利用过程和shiro差不多,shiro需要登录网站,并从cookie中获取RememberMe。

       进行登录,使用正确的账号和密码:

       先使用正确的账号密码登录后,在抓包获取合法 Cookie(勾选Remember Me)

       如果认证失败则只能得到 rememberMe=deleteMe

       将登录后获取的set-cookie值当中的rememberMe值,将值复制下来,放到工具当中

       选择shiro,输入目标url,设置rememberMe值,点击下一步,等待即可

       选择检测方式:

       等待即可:

       使用shiro综合工具:

       输入url后:进行爆破秘钥,爆破利用链以及回显

       命令执行:

       工具地址

Shiro源码分析---FilterChain创建过程

       在Shiro框架中,无论是进行认证还是权限控制,都依赖于过滤器的配置与应用。在实际开发中,可能需要配置多个过滤器,但每个请求所经过的过滤器组合却因请求不同而异。因此,理解一个请求会通过哪些过滤器,对于熟练使用Shiro至关重要。本文将详细解析请求通过的过滤器创建过程。

       Shiro框架通过`org.apache.shiro.web.filter.mgt.FilterChainResolver`接口定义了如何确定一个请求应经过哪些过滤器。接口中的唯一方法`getChain`负责查找并组装一个过滤器链(FilterChain),该链包含了请求处理过程中所应用的所有过滤器。`FilterChain`是一个熟知的概念,尤其是对于Servlet开发人员来说,它在日常工作中常见。而`FilterChainResolver`仅是一个接口,Shiro提供了默认实现类`org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver`,该实现类利用请求路径来匹配相应的过滤器。

       在深入理解PathMatchingFilterChainResolver的源码前,先来看看FilterChainManager是如何管理和创建FilterChain的。Shiro提供了一个默认的FilterChainManager实现类`org.apache.shiro.web.filter.mgt.DefaultFilterChainManager`。其关键方法`createChain`在系统启动时被调用,用于创建各个FilterChain。以配置示例`/static/**、/formfilterlogin,/role`为例,`chainName`与`chainDefinition`分别代表了需要管理的FilterChain名称与定义。

       了解了FilterChainManager的创建与管理机制后,接下来关注FilterChainResolver如何确定请求所需过滤器链。在`DefaultFilterChainManager.proxy`方法中,`NamedFilterList`的实现类`org.apache.shiro.web.filter.mgt.SimpleNamedFilterList`被调用,此步骤是确定过滤器链的关键环节。

       至此,Shiro框架中FilterChain创建过程已全面解析完成。如有任何错误或需要进一步讨论的问题,欢迎指正。感谢阅读,期待更多的技术交流。

相关栏目:综合