Shiro 历史漏洞分析

Apache Shiro(身份验证绕过漏洞CVE-2010-3863) 低于 1.1.0 的 Apache Shiro 和 JSecurity 0.9.x 在将 URI 路径与 shiro.ini 文件中的条目进行比较之前不会将其规范化,这允许远程攻击者通过构建的请求绕过预期的访问限制,如 /、/./、../、//。Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,可执行身份验证、授权、加密和会话管理。无法访问对管理页面的直接请求,并将重定向到登录页面。靶机地址:192.168.159.128。以绕过身份验证检查并成功访问管理页面。 阅读详情

声明

出品|先知社区(ID:alter99)

以下内容,来自先知社区的alter99作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

什么是Shiro

blog.csdnimg.cn/img_convert/4bfeca413896e9fbe5889b69e78f403d.png)

Apache Shiro is a powerful and easy-to-use Java security framework that performs authenticat-ion(身份验证), authorization(授权), crypto-graphy(加密), and session management(会话管理). With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.

相关CVE

根据官方网站上的漏洞通报,Shiro 在历史上共通报了 11 个 CVE(以及最新披露的CVE),其中包含认证绕过、反序列化等漏洞类型,接下来我们来依次学习。

图片

CVE-2010-3863

漏洞信息

**漏洞编号:**CVE-2010-3863 / CNVD-2010-2715
**影响版本:**shiro < 1.1.0 和JSecurity 0.9.x
**漏洞描述:**Shiro进行权限验证前未进行路径标准化,导致使用时可能绕过权限校验
**漏洞补丁:**Commit

漏洞分析

先分析一下Shiro身份验证的流程:Shiro使用org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain 方法获取和调用要执行的 Filter

逻辑如下:
在getPathWithinApplication()方法中调用 WebUtils.getPathWithinApp-lication()方法,用来获取请求路径。其中getContextPath(request)方法获取 Context 路径

图片

\getRequestUri(request) 方法获取URI 的值,并调用 decodeAndCleanUriString() 处理。

图片

在decodeAndCleanUriString()中对

; 进行了截取。
此时contextPath值为/samples_web_war,requestUri值为/samples_web_war/login.jsp
然后判断requestUri是否以contextPath开始,是的话将其替换为/

处理之后的请求URL将会使用AntPathMat-cher#doMatch进行权限验证。此时发现,Shiro中对URI并没有进行路径的标准化处理,这样当URI中存在特殊字符时,就存在绕过风险

复现

[urls]
/login.jsp = authc
/logout = logout
/account/** = authc
/remoting.jsp = authc, perms["audit:list"]
/** = anon

有了上面的配置,直接访问:/remoting.jsp,会因为没有权限而跳转至登陆界面。
当访问 /./remoting.jsp,由于其不能与配置文件匹配,导致进入了 /** 的匹配范围,导致可以越权访问

图片

漏洞修复

Shiro 在 Commit 更新中添加了标准化路径函数。
对 /、//、/./、/…/ 等进行了处理。

CVE-2014-0074

漏洞信息

漏洞编号:

CVE-2014-0074/CNVD-2014-03861/SHIRO-460

**影响版本:**shiro 1.x<1.2.3
**漏洞描述:**当程序使用LDAP服务器并启用非身份验证绑定时,远程攻击者可借助空的用户名或密码利用该漏洞绕过身份验证。
**漏洞补丁:**Commit

漏洞分析

当使用了未经身份验证绑定的LDAP服务器时,允许远程攻击者通过空用户名或空密码绕过身份验证。

漏洞修复

Shiro 在 f988846 中针对此漏洞进行了修复

图片

图片

CVE-2016-4437

漏洞信息

漏洞编号:

CVE-2016-4437/CNVD-2016-03869/S

HIRO-550
**影响版本:**shiro 1.x < 1.2.5
**漏洞描述:**利用硬编码的密钥构造rememberMe参数,进行反序列化攻击
**漏洞补丁:**Commit
参考: Shiro 550反序列化漏洞分析

漏洞分析

关键代码处于

AbstractRememberMeManager#getRememberedPrincipals 方法中,参数是用户的身份Context信息,如下图

图片

图片

这个方法主要是把SubjectContext转化成Princi-palCollection。该方法调用了getRemembered-SerializedIdentity和convertBytesToPrincipals方法。

其中CookieRememberMeManager 的getRemem-beredSerializedIdentity的实现是获取Cookie并Base64解码

图片

将解码后的byte数组传入convertBytesToPrincipals中进行:decrypt和deserialize。decrypt是使用AesCipherService进行解密。

图片

deserialize调用deserialize()方法反序列化解密后的数据。

图片

反序列化得到的PrincipalCollection会被set到SubjectContext 。

图片

解密的调用栈入下图所示

图片

此时就可以想象,如果我们有了加密密钥,使用密钥加密一个恶意序列化的payload,将rememberMe的值替换成base64后的payload传入服务器,那这样就可以触发漏洞了。关键点在于,我们如何获取加密密钥?

这就要提到AbstractRememberMeManager类,它是RememberMeManager 接口的实现。类中有几个关键变量:

  • DEFAULT_CIPHER_KEY_BYTES:对称密钥,使用Base64加密之后直接存在代码中

  • serializer:Shiro 提供的序列化器

  • cipherService:用来对数据加解密的类

图片

图片

漏洞利用

编写一个poc

package com.alter.Shiro;
import com.alter.Deserialize.CommonsCollections6;
import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.util.ByteSource;
public class test {
    public static void main(String[] args) throws Exception {
        byte[] payloads = new CommonsCollections6().getPayload("/System/Applications/Calculator.app/Contents/MacOS/Calculator");
        AesCipherService aes = new AesCipherService();
        byte[] key = java.util.Base64.getDecoder().decode("kPH+bIxk5D2deZiIxcaaaA==");
        ByteSource ciphertext = aes.encrypt(payloads, key);
        System.out.printf(ciphertext.toString());
    }

将生成的payload赋值给rememberMe,但是发送过去后,服务器报错。

图片

下面根据p师傅的分析复现一下报错原因,发现是这个类:

org.apache.shiro.io.ClassResolvingObjectInputStream的问题。可以看到这是一个ObjectInputStream的子类,其重写了resolveClass方法(resolveClass是反序列化中用来查找类的方法):

图片

对比一下它的父类,也就是正常的ObjectInputStream 类中的resolveClass 方法:

图片

区别就是前者用的是org.apache.shiro.util.Class-Utils#forName(实际上内部用到了org.apache.-catalina.loader.ParallelWebappClassLoader#loadClass),而后者用的是Java原生的Class.forName

调试发现出现异常时加载的类名为[Lorg.apache.comm-ons.collections.Transformer;这个类名看起来怪,其实就是表示org.apache.-commons.collections.Transformer的数组。

图片

所以,网上很多文章就给出结论,Class.forName支持加载数组,ClassLoader.loadClass不支持加载数组,这个区别导致了问题。但p师傅在Java漫谈中否定了这一观点,并写出结论:如果反序列化流中包含非Java自身的数组,则会出现无法加载类的错误。这就解释了为什么CommonsCollections6无法利用了,因为其中用到了Transformer数组。

p师傅在漫谈中分析讲解了两种poc,一个是使用TemplatesImpl改造的无数组CCShiro反序列化链,这个链需要有CC依赖,另一个是CB的无依赖Shiro反序列化链,这两个poc都可以测试成功了。

漏洞修复

Shiro 在 1.2.5 的 Commit 中对此漏洞进行了修复。系统在启动的时候会生成一个新key,用户也可以手动配置一个cipherKey。

图片

其实在 SHIRO-441,就有人提出了硬编码可能带来的问题。

CVE-2016-6802

漏洞信息

**漏洞编号:**CVE-2016-6802 / CNVD-2016-07814
**影响版本:**shiro < 1.3.2
**漏洞描述:**Shiro未对ContextPath做路径标准化导致权限绕过
**漏洞补丁:**Commit
参考 : su18师傅

漏洞详解

本漏洞类似 CVE-2010-3863,依旧是路径标准化导致的问题,不过之前是在 RequestURI 上,本漏洞是在 ContextPath 上。

之前提到,Shiro 调用 WebUtils.getPathWithin-Application() 方法获取请求路径。逻辑如下:

public String getPathWithinApplication(HttpServletRequest request) {
    String contextPath = this.getContextPath(request);
    String requestUri = this.getRequestUri(request);
    String path = this.getRemainingPath(requestUri, contextPath, true);
    if (path != null) {
        return StringUtils.hasText(path) ? path : "/";
    } else {
        return requestUri;
    }
}

其中调用getContextPath()方法,获取contextPath;

调用getRequestUri()方法,获取uri ;

在getContextPath()方法调用decodeRequest-String进行URLDecode。

图片

由于获取的 ContextPath 没有标准化处理,如果出现一些特殊字符使ContextPath与实际不符,都会导致在 StringUtils.startsWithIgnoreCase() 方法判断时失效,直接返回完整的RequestURI。

复现

登录账户lonestarr,该账户对页面remoting.jsp没有访问权限,在跟路径前加任意路径,再加…/即可实现绕过

图片

图片

漏洞修复

Shiro 在 1.3.2 版本的 Commit 中对此漏洞进行了修复。

图片

通过代码可以看出,在 WebUtils.getContextPath 方法进行了更新,使用了修复 CVE-2010-3863 时更新的路径标准化方法 normalize 来处理 ContextPath 之后再返回。

框架、组件漏洞系列4:Apache shiro漏洞汇总 一、Apache Shiro 简介 1、什么是shiro Apache Shiro提供了认证、授权、加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码。并且在实现此目标时无须依赖第三方的框架、容器或服务,当然也能做到与这些环境的整合,使其在任何环境下都可拿来使用。 Shiro将目标集中于Shiro开发团队所称的“四大安全基石”-认证(Authentication)、授权(Authorization)、会话管理(Session Management)和加. 阅读详情

相关推荐

Shiro反序列化漏洞利用笔记

Shiro反序列化漏洞利用笔记 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。目前在Java web应用安全框架中,最热门的产品有Spring Security和Shiro,二者在核心功能上几乎差不多,但Shiro更加轻量级,使用简单、上手更快、学习成本低,所以Shiro的使用量一直高于Spring Security。产品用户量之高,一旦爆发漏洞波及范围相当广泛,研究相关漏洞是很有必要的。 一、Shiro反序列化漏洞 1.1 安全框架 Apache Sh

文公子的博客 7871

vulhub靶场shiro系列漏洞复现CVE-2010-3863、CVE-2016-4437(shiro550)、CVE-2020-1957、shiro721

以上shiro反序列化,权限绕过,shiro-721 代码执行也可以用上面工具检测到并利用工具下载地址shiro反序列化综合利用工具:https://github.com/j1anFen/shiro_attack/releasesshiro漏洞检测工具yakit:https://github.com/yaklang/yakit/tags。

qq_58873970的博客 3224

BurpShiroPassiveScan:被动扫描Shiro反序列化漏洞的自动化利器

在Web安全测试领域,反序列化漏洞是一种常见的高危安全风险,其原理在于应用程序在反序列化不可信数据时可能执行恶意代码。Shiro框架作为广泛使用的Java安全框架,其RememberMe功能的默认密钥硬编码问题曾引发大规模反序列化漏洞。针对这类漏洞的检测,被动扫描技术提供了一种高效且隐蔽的解决方案。被动扫描器通过分析已有的网络流量进行模式匹配和特征识别,无需主动发送攻击载荷,从而显著降低了测试的侵入性和被防御系统发现的概率。BurpShiroPassiveScan正是这样一款集成在Burp Suite中的被

weixin_30800807的博客 493

vulhub shiro漏洞复现 | CVE-2010-3863、CVE-2016-4437、CVE-2020-1957漏洞复现(详细图解)

vulhub shiro漏洞复现 | CVE-2010-3863认证绕过漏洞、CVE-2016-4437/1.2.4反序列化/shrio550、CVE-2020-1957认证绕过漏洞漏洞复现(详细图解)

鱼溯的博客 2690

Shiro与Sa-Token权限框架对比与选型指南

权限管理是企业级应用开发中的核心组件,主要解决认证(Authentication)、授权(Authorization)和会话管理(Session)三大问题。Java生态中,Shiro以其灵活的模块化架构著称,适合需要深度定制的场景;而Sa-Token则凭借开箱即用的设计和现代化的无状态会话机制,在微服务和云原生环境中表现优异。从技术实现来看,Shiro采用经典的Subject-SecurityManager-Realm分层模型,支持多种数据源接入;Sa-Token则通过静态工具类StpUtil提供简洁API

weixin_30381317的博客 299

Spring Security、Shiro与Sa-Token深度对比:认证授权选型指南

在Java后端开发中,认证授权是保障系统安全的核心环节,而安全框架的选择直接影响开发效率与维护成本。从最基础的认证授权原理出发,理解框架如何管理用户身份与权限验证,是构建可靠系统的前提。Spring Security、Shiro与Sa-Token作为主流的Java安全框架,分别代表了生态集成、轻量灵活与极致简洁三种设计思路:前者依托过滤器链与Spring生态提供全面的防护能力,Shiro通过Subject、SecurityManager与Realm抽象简化权限模型,而Sa-Token则以Token机制实现开

weixin_32715349的博客 242

shiro历史漏洞分析

shiro历史漏洞分析

include_voidmain的博客 1758

Shiro反序列化漏洞应急响应实战:从告警分析到安全加固

在Java Web应用安全领域,身份认证与授权是核心组件。Apache Shiro作为广泛使用的安全框架,其原理是通过过滤器链处理登录、权限等安全逻辑。然而,历史上其反序列化机制存在设计缺陷,攻击者可构造恶意序列化数据,利用默认密钥或特定漏洞绕过安全限制,在服务器上执行任意代码,技术价值在于理解该漏洞可提升整体应用安全水位。典型的应用场景包括各类使用Shiro进行权限管理的企业门户、后台管理系统。本文基于一次真实的Shiro反序列化漏洞应急响应事件,详细拆解了从告警确认、攻击遏制、深度排查到根除恢复的全流程

weixin_27199085的博客 245

shiro历史漏洞分析—CVE-2020-1957漏洞

shiro历史漏洞分析—CVE-2020-1957漏洞

include_voidmain的博客 2225

Apache Shiro CVE-2020-13933身份验证绕过漏洞原理与复现

身份验证是Web应用安全的核心机制,它确保只有合法用户才能访问受保护的资源。其原理通常基于过滤器链或拦截器,对请求路径进行模式匹配,从而决定是否执行认证逻辑。在Java生态中,Apache Shiro作为广泛使用的安全框架,提供了简洁的权限控制配置。然而,框架实现中的路径匹配逻辑缺陷可能导致严重的安全漏洞,例如身份验证绕过,使得攻击者无需凭证即可访问后台接口,直接威胁业务安全。CVE-2020-13933正是这样一个典型案例,它源于Shiro的Ant风格路径匹配器在处理含分号的请求时存在逻辑缺陷,结合Ser

weixin_30266885的博客 795

Nginx、Spring、Shiro等中间件高危漏洞原理与实战防御指南

在分布式系统与微服务架构中,中间件和框架构成了技术栈的核心基础,其安全性直接关系到整个系统的稳定与数据安全。从原理层面看,漏洞通常源于配置错误、设计缺陷或实现瑕疵,例如反序列化机制、路径解析逻辑或加密模式的选择。这些底层安全问题一旦被利用,可导致远程代码执行、敏感信息泄露或权限提升等严重后果,其技术价值在于理解攻击链与防御点的对应关系。在应用场景上,无论是作为流量入口的Nginx/Apache Web服务器,还是承载业务逻辑的Spring、Shiro应用框架,或是Fastjson等基础组件,都需建立纵深防御

weixin_34161029的博客 361

shiro历史漏洞分析—CVE-2020-11989/CVE-2020-13933

shiro历史漏洞分析—CVE-2020-11989/CVE-2020-13933

include_voidmain的博客 2083

Shiro反序列化漏洞深度解析:从AES密钥硬编码到RCE实战攻防

Java反序列化是Java安全领域的核心概念之一,它允许将字节流还原为对象,但这一机制也带来了严重的安全风险。其原理在于,Java在反序列化时会自动调用对象的readObject方法,如果反序列化的数据被恶意构造,就可能触发任意代码执行。这一技术价值在于,它常被用于框架间的数据传递,但一旦处理不当,就会成为攻击者突破系统防线的关键入口。在Web应用安全中,反序列化漏洞常出现在处理用户可控数据的场景,例如Cookie、Session或RPC通信。Apache Shiro框架的“记住我”功能正是这样一个典型场景

weixin_33794672的博客 366

转载:任意下载文件漏洞

edusrc--某985任意文件下载 00demons00 2023-02-26 20:28:24 文章来自于公众号:WK安全 欢迎大家多多支持 免责声明 由于传播、利用WK安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,WK安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢! 打开url:http://xxxxxxx/login 目测是一个RuoYi框架,根据以往的历史漏洞曝光,有以下这些: 1、shiro默认

qq_43907122的博客 711

红队攻防渗透技术实战流程:组件安全:Solr&Shiro&log4j

历史漏洞:https://avd.aliyun.com/search?历史漏洞:https://avd.aliyun.com/search?历史漏洞:https://avd.aliyun.com/search?黑盒特征:盲打 会问蓝队攻击特征(${jndi:rmi:///osutj8})影响范围:Apache Shiro

HACKONE的博客 502

Unity URP项目里Post Processing死活没效果?别急,这5个坑我帮你踩过了

本文详细解析了Unity URP项目中Post Processing效果不显示的5个常见问题及解决方案,包括管线配置、Volume设置、摄像机选项、Layer冲突和Shader兼容性。通过专业排查步骤和实用代码片段,帮助开发者快速定位并修复后处理效果失效问题,提升项目开发效率。

weixin_28693309的博客 234

java安全-javasec-0.0.1-SNAPSHOT靶场通关第三部分

RMI:远程方法调用注册表可以远程加载实现你自己vps上的恶意rmi服务,这里执行不了,看一下代码就行了,生成的远程rmi对象是用工具生成的,生成之后出插入文本框即可,下面有介绍。

2401_87348491的博客 339

UniDexGrasp++算法实战:无需预生成姿态的灵巧抓取测试指南

本文详细解析了UniDexGrasp++算法在灵巧抓取测试中的实战应用,该算法无需预生成姿态即可实现高效抓取,特别适合处理形状不规则的物体。文章涵盖了环境配置、数据集优化、训练流程及实际测试中的调参技巧,帮助开发者快速掌握这一ICCV 2023提出的先进算法。

weixin_29045585的博客 279

shiro反序列化漏洞

Apache官方披露Apache Shiro权限绕过漏洞(CVE-2022-32532),当Apache Shiro中使用RegexRequestMatcher进行权限配置,且正则表达式中携带"."时,未经授权的远程攻击者可通过构造恶意数据包绕过身份认证,导致配置的权限验证失效。会存在一段base64加密的字段,解码后就是攻击者的回显内容。shiro721的加密key基本猜不到,系统随机生成,可以使用登陆后的rememberMe去爆破正确的key值,即利用有效的RememberMe Cookie作为。

2403_82795493的博客 1669

【全部更新】2025金地杯E题山西省大学生数学建模思路代码文章教学:高速铁路牵引供电系统能耗优化

问题四将列车的运行速度与发车时间同时作为优化变量,建立联合优化模型,目标是在考虑电价机制和调度均衡性的前提下,使牵引供电系统一天内的总电费支出最小。问题三在考虑分时电价机制的基础上,基于遗传算法优化列车速度组合,使牵引供电系统一天内的总电费支出最小。然而,在实际运营中,不同时段的电价差异显著,合理安排列车的运行时间与运行速度,可有效降低系统的总电费支出。本研究聚焦于高速铁路牵引供电系统的能耗与电费优化问题,针对列车运行速度、发车时间与分时电价的综合影响,提出一系列数学模型,以实现系统能耗与电费的最小化。

xb459149247的博客 5289

OPPO 后端校招面试,过于简单了!

你好,我是 Guide。2026 届秋招陆续开奖公司的越来越多了,今天来看一家手机厂 OPPO。前几天,已经分享了和今年校招开奖的情况。其中,小红书的薪资最为炸裂,大白菜一年都能给到 51w+。不过,相对应的工作强度和压力也是真的难顶,确实很难有钱多又轻松的活!OV (OPPO 和 Vivo)这几年发展真还可以的,这两家的高端机口碑都不错。本人也是最近入手了一款 Vivo 的上一代旗舰,拍照是真的不错啊!每个月会有 1.2k 生活补贴,生活费是按照 8 % 缴纳。

JavaGuide 751
上一篇: 聊一聊基于“ebpf xdp“的rootkit
下一篇: CVE-2019-12422漏洞分析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值