shiro简介
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
官方网站:Apache Shiro | Simple. Java. Security.
shiro-550(CVE-2016-4437)
漏洞简介
官方issues:https://issues.apache.org/jira/browse/SHIRO-550
Apache Shiro框架提供了记住我(RememberMe)的功能,功能表现为关闭浏览器再次访问时无需再登录即可访问。shiro默认使用CookieRememberMeManager,对rememberMe的cookie做了加密处理,在CookieRememberMeManaer类中将cookie中rememberMe字段内容先后进行序列化、AES加密、Base64编码操作。服务器端识别身份解密处理cookie的流程则是: 获取rememberMe cookie ->base64 解码->AES解密(加密密钥硬编码)->反序列化(未作过滤处理)。
但是AES加密的密钥Key被硬编码在代码里,这就意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。shiro将rememberMe进行解密并且反序列化,最终就造成了反序列化漏洞。如果在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段,那么就可能存在此漏洞。
影响版本
Apache Shiro <= 1.2.4
环境搭建
直接使用shiro官方的samples-web进行分析
git clone https://github.com/apache/shiro.git
cd ./shiro
# 恢复到shiro-1.2.4版本
git checkout shiro-root-1.2.4
打包前需要对./shiro/samples/web/pom.xml进行一些修改:
<!-- 需要设置编译的版本 -->
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
...
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<!-- 这里需要将jstl设置为1.2,添加如下一行 -->
<version>1.2</version>
<scope>runtime</scope>
</dependency>
.....
<!-- 这里添加CC3.2.1库是为了方便演示有依赖的反序列化RCE -->

本文介绍了ApacheShiro1.2.4版本中的反序列化漏洞,涉及硬编码的AES密钥导致攻击者可构造恶意数据,通过控制序列化和反序列化过程进行潜在的恶意操作。作者提供了环境搭建和漏洞分析的详细步骤,包括无依赖和有依赖于commons-collections的情况。
最低0.47元/天 解锁文章
1041

被折叠的 条评论
为什么被折叠?



