1.Shiro源码分析---FilterChain创建过程
2.反序列化漏洞原理详解
3.shiro反序列化漏洞原理分析以及漏洞复现(Shiro-550/Shiro-721漏洞复现)
4.å»ç设å¤ç®¡çç³»ç»
5.盘点 35 个 Apache 顶级项目,我拜服了…
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创建过程已全面解析完成。如有任何错误或需要进一步讨论的问题,欢迎指正。感谢阅读,期待更多的技术交流。
反序列化漏洞原理详解
Apache Shiro 是一款强大且易用的 Java 安全框架,专用于执行身份验证、授权、密码和会话管理。管家平台源码在本文中,我们将深入剖析 Shiro 的认证和授权流程,特别关注 rememberme 字段如何引发反序列化漏洞。
首先,让我们探讨 Shiro 的认证过程。当用户尝试登录时,Shiro 通过验证用户名和密码来确认用户身份。这一过程在源码中清晰可见,主要通过 UsernamePasswordToken 对象和 Subject.login()方法实现。Subject 对象是 Shiro 中的核心概念,负责存储用户信息。在认证过程中,Shiro 通过调用 Realm 的 doGetAuthenticationInfo()方法来验证用户信息。该方法从数据库查询用户信息并进行比对,最终确认用户身份。
接下来,我们关注 Shiro 的授权机制。授权过程围绕着生成的 Subject 对象进行,确保用户具备访问特定资源所需的权限。在 Shiro 的配置文件中,权限规则被明确指定。通过调用 doGetAuthorizationInfo()方法,Shiro 能够为用户授权。这一过程中,Shiro 比较用户权限与资源所需权限,以确定用户是否具有访问权限。
然而,Rememberme 字段是引发反序列化漏洞的关键。在登录时选择 Rememberme 选项,Cookie 中会存储序列化数据,允许用户在无需重新登录的情况下访问特定资源。Shiro 通过 DefaultSecurityManager 类生成 rememberme,并将其存储在浏览器中。当用户关闭浏览器时,与服务端的会话通常会结束。但若选择 Rememberme,即使关闭浏览器,数据依然存储,用户下次访问指定资源时,浏览器会携带 rememberme,实现无须登录的访问。
反序列化漏洞的根源在于 rememberme 字段中存储的序列化数据。Shiro 在生成 rememberme 时,vscodepython查看源码会将用户信息序列化为 PrincipalCollection 对象,并使用 AES 加密。密钥被硬编码在代码中。通过解密和反序列化这一序列化数据,攻击者可以获取用户的敏感信息,从而触发反序列化漏洞。
总结,Apache Shiro 是一款功能强大的安全框架,但在配置和使用中需谨慎处理 Rememberme 字段,以避免潜在的安全风险。理解 Shiro 的认证和授权流程,以及反序列化漏洞的机制,有助于提升系统安全性。
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模式,使用位数据块为一组进行加密解密,即字节明文,对应字节密文,源码html系统,明文加密时,如果数据不够字节,则会将数据补全剩余字节
若最后剩余的明文不够字节,需要进行填充,通常采用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后:进行爆破秘钥,爆破利用链以及回显
命令执行:
工具地址
å»ç设å¤ç®¡çç³»ç»
å»ç设å¤ç®¡çç³»ç»æºç ï¼å»é¢å»ç设å¤ç®¡çç³»ç»æºç å è´¹å享使ç¨ææ¯ï¼Spring Bootï¼Apache Shiroï¼Thymeleafï¼MyBatisï¼
æ°æ®åºè¿æ¥æ± ï¼Druidï¼Fastjsonã
æ建ç¯å¢ï¼ideaãjava1.8ãmysql5.7 maven3
å»é¢ 设å¤ç®¡ç ç³»ç»æ¯å©ç¨è®¡ç®æºç¡¬ä»¶ã软件ãç½ç»è®¾å¤é信设å¤ä»¥åå ¶ä»åå ¬è®¾å¤ï¼è¿è¡è®¾å¤è¿è¡ä¿¡æ¯çæ¶éãä¼ è¾ãå å·¥ãå¨åãæ´æ°åç»´æ¤ï¼ä»¥æé«è®¾å¤å©ç¨æç为ç®çï¼æ¯æé«å±å³çãä¸å±æ§å¶ãåºå±è¿ä½çéæåçè®¾å¤ ä¿¡æ¯ç®¡çå¹³å° ã
ç³»ç»ä¸»è¦åè½ï¼ç»éï¼æ³¨åï¼ç³»ç»ç¨æ·ç®¡çï¼è§è²ï¼é¨é¨ç®¡çï¼è®¾å¤å¢å æ¹æ¥ã
ç³»ç»åè½ç®ä»ï¼
1ã ç³»ç»ç®¡çï¼ ç¨æ·ç®¡çãè§è²ç®¡çãèå管çãé¨é¨ç®¡çãå²ä½ç®¡çãåå ¸ç®¡çãåæ°è®¾ç½®ãéç¥å ¬åãæ¥å¿ç®¡ççã
2ã ç³»ç»çæ§ï¼å®æ¶çæ§è®¾å¤è¿è¡ãå¾ æºãè°è¯ãå ³æºãåæºçç¶æï¼è®°å½è®¾å¤æ£å¸¸å·¥ä½æ¶é´ã
3ã设å¤ç®¡çï¼è®¾å¤ä¿¡æ¯ç®¡çï¼å æ¬è®¾å¤å称ã设å¤ç¼å·ã设å¤ä»·æ ¼ã设å¤å家ãå家çµè¯ãæ¯å¦é«å¼ã设å¤ç¶æãè´ç½®æ¥æãå项ç¼è¾æä½çï¼
盘点 个 Apache 顶级项目,我拜服了…
Apache软件基金会,全称为Apache Software Foundation(ASF),成立于年7月,是世界上最大的最受欢迎的开源软件基金会,是一个非营利性组织,专门支持开源项目。
目前,ASF旗下有超过+亿美元的价值,为开发者提供免费的开源软件和项目,惠及全球数十亿用户。
接下来,我们将盘点Apache软件基金会旗下的个顶级项目,这些项目在日常开发过程中常常遇到,有的可能已经使用过,而有的则值得学习了解,为未来项目提供参考。
1. Apache(httpd):Apache HTTP Server,中文名阿帕奇,是一个开源的HTTP服务器,支持在UNIX和Windows系统上运行。它自年4月起成为互联网上最受欢迎的web服务器,年2月庆祝了其岁生日。适用于HTML、等静态资源服务,类似于Nginx,但Nginx功能更为强大。
2. Tomcat:Apache开源的Java应用服务器,支持Java Servlet、JavaServer Pages、Java Expression Language和Java WebSocket技术。尽管近年来存在安全漏洞,但因其开源、免费的特性,仍被广泛应用于Java领域,成为主流应用服务器。
3. Commons:包含一系列Java公共组件的项目,提供Java核心API的额外组件,如StringUtils等。提供个实用的类库,极大地方便了Java开发。
4. POI:提供了一系列Java API对Microsoft Office格式文件进行读写处理,如Excel、Word、PowerPoint等文件的读写,功能强大。
5. HttpComponents:提供了HTTP及相关协议的Java组件和工具集,包括HttpCore、HttpClient、HttpAsyncClient,其中HttpClient是常用的HTTP客户端。
6. Logging services:包含Apache的日志服务,如Log4j,是使用最广泛的日志框架,还有Log4j 2、log4php、log4cxx等其他语言的日志框架。
7. Ant:一个较为老的Java项目编译和构建工具,虽然已经较少使用,但依然存在一定的价值。
8. Maven:是一个主流的软件项目管理工具,提供项目自动编译、单元测试、打包、发布等生命周期管理。
9. Subversion:一个开源的版本控制软件,用于代码版本控制、文件版本控制,几乎每个开发者都使用过。
. Struts:一个免费开源的MVC框架,用于创建Java web应用程序,曾风靡一时,但由于漏洞问题,已逐渐被Spring MVC、Spring Boot等替代。
. FreeMarker:是一个基于Java的模板引擎,允许使用简单而强大的模板语言引用Java代码中的对象来生成HTML页面、电子邮件、配置文件、源代码等。
. Velocity:一个基于Java语言的模板引擎,允许使用模板语言引用Java对象生成文本输出。尽管长期未更新,不再被Spring Boot 1.5.x版本支持,但仍推荐使用其他模板引擎。
. Tapestry:一个在Java Web开发界知名的面向组件的Web框架,用于创建高度可伸缩的Web应用程序。
. Shiro:一个功能强大且易于使用的Java安全框架,提供身份验证、授权、加密和会话管理等功能,有助于快速、轻松地开发和保护企业应用程序。
. Dubbo:阿里巴巴开源的分布式服务框架(RPC),曾停止维护后又重启维护并捐献给Apache软件基金会,现在在许多企业中仍大量运用。
. Thrift:一款优秀的、轻量级的RPC框架,最初由Facebook开发,后捐献给Apache软件基金会。支持多种语言,具备高度可扩展性。
. Zookeeper:一个分布式中间件神器,最初由Google Chubby的一个开源实现,主要用途包括配置中心、分布式锁等,支持高度可靠的分布式服务协调中间件。
. Curator:Zookeeper的Java客户端,提供一系列高级API和工具,简化了Zookeeper操作,易于使用。
. SkyWalking:一个可观测性分析平台和应用性能管理系统,提供分布式跟踪、指标监控、性能诊断、度量汇总和可视化的一体化解决方案。
. ShardingSphere:由一组分布式数据库中间件解决方案组成的开源生态系统,包括JDBC、Proxy、Sidecar(计划中),提供数据分片、分布式事务和数据库编排功能。
. Lucene:顶级的开源搜索框架,包括核心搜索库(Lucene core)和搜索服务器(Solr),提供强大的索引和搜索功能。
. ActiveMQ:一款灵活、强大的多协议开源消息中间件,支持JMS 1.1&2.0,目前最流行的Java消息中间件之一。
. RocketMQ:一款重量级、极具竞争力的消息队列产品,由阿里巴巴于年开源,年捐赠给Apache软件基金会,年正式毕业。
. Kafka:一款重量级开源项目,最初由LinkedIn公司开发,后捐献给Apache软件基金会。它是一种分布式、高吞吐量的发布订阅消息系统,能够实时处理大量数据。
. Hadoop:一种高可靠、可伸缩、分布式大数据处理框架,也是大数据行业公认的标准框架。
. HBase:建立在Hadoop HDFS上的非关系数据库,用于大数据存储,适用于随机、实时的读写访问。
. Pig:一个基于Hadoop的大数据分析平台,提供类似SQL的面向数据流的高级语言Pig Latin,用于执行Map Reduce任务。
. Hive:一个基于Hadoop的数据仓库工具,用于提取、转化和加载数据,可以将Hadoop原始结构化数据映射为Hive表,并提供类似SQL的HiveQL语言查询功能。
. Spark:一个用于大规模数据处理的统一分析引擎,支持无边界和有边界数据流上的有状态计算。
. Flink:一个分布式处理引擎框架,用于无边界和有边界数据流上的有状态计算,设计用于在所有常见的集群环境中运行。
. Storm:一个分布式实时计算系统,能够轻松可靠地处理数据流,类似于Hadoop的实时批处理。
. Cassandra:一款可伸缩、高可用、高性能去中心化的分布式数据库,最初由Facebook为了解决消息收件箱搜索问题而设计。
. CouchDB:一个面向文档的分布式数据库,以JSON作为存储格式和查询语言,提供直观可靠的RESTful API接口。
. Groovy:一个功能强大的基于JVM平台的动态编程语言,语法与Java相似,但更简洁、易于学习和高效。
. NetBeans:一款开源开发工具(IDE),集成开发环境和应用框架,支持Java、JavaScript、PHP等编程语言,最初由SUN公司开发,后被Oracle收购并捐赠给Apache软件基金会。
总结:这些顶级项目涵盖了基础组件、Web、分布式、搜索、消息中间件、大数据/数据库、编程语言、工具等多个领域,为Java生态系统的发展做出了巨大贡献。尽管有些项目面临淘汰,但它们都曾经辉煌过,正是这些开源项目推动了Java生态的繁荣。希望本文的分享对大家在日常开发中有所帮助。