Apache Shiro 1.2.4 反序列化漏洞(CVE-2016-4437)

一:漏洞概述

Apache Shiro 1.2.4 及以下版本存在反序列化漏洞(CVE-2016-4437),攻击者可利用该漏洞通过伪造的 RememberMe Cookie 触发恶意代码执行。漏洞根源在于 Shiro 使用了固定 AES 加密密钥加密用户身份信息,导致攻击者可构造恶意序列化数据,利用已知密钥加密后植入 Cookie,触发服务端反序列化漏洞。

二:环境搭建

vul靶场搭建:

三:漏洞原理分析

1. RememberMe 机制流程

用户登录时若勾选"记住我",Shiro 会执行以下流程生成 Cookie:

  1. 序列化身份信息
    用户身份(如 PrincipalCollection)被序列化为字节数组。

  2. AES 加密
    使用硬编码密钥 kPH+bIxk5D2deZiIxcaaaA== 对序列化数据进行 AES-CBC 加密。

  3. Base64 编码
    加密结果经 Base64 编码后存入 rememberMe Cookie。

关键代码AbstractRememberMeManager 类):

java 复制代码
protected byte[] convertPrincipalsToBytes(PrincipalCollection principals) {
    byte[] bytes = serialize(principals); // 序列化
    if (getCipherService() != null) {
        bytes = encrypt(bytes); // AES 加密
    }
    return bytes;
}

2. 漏洞触发点

服务端在接收到 rememberMe Cookie 时,会进行以下操作:

  1. Base64 解码

  2. AES 解密
    使用固定密钥解密数据。

  3. 反序列化
    解密后的字节流直接反序列化为对象,未做安全校验。

反序列化入口(DefaultSecurityManager 类):

java 复制代码
public PrincipalCollection getRememberedPrincipals(SubjectContext subjectContext) {
    byte[] bytes = getRememberedSerializedIdentity(subjectContext); // 提取 Cookie
    if (bytes != null) {
        return convertBytesToPrincipals(bytes, subjectContext); // 解密并反序列化
    }
    return null;
}

3. 漏洞成因

  • 固定加密密钥:硬编码密钥使攻击者可预测加密结果。

  • 无反序列化过滤 :解密后的数据直接调用 ObjectInputStream,未限制可反序列化的类。

四:漏洞复现

1.浏览器访问 http://192.168.1.100:8080/doLogin

2.用bp抓取登录包(勾选remember me)

发现请求包中是否有rememberme字段,响应包中有Set-cookie:rememberMe=deleteMe字段。

3.启动 工具ShiroAttack2。(使用jdk8)

4.检测是否存在漏洞,爆破密钥 ,爆破利用链及回显

5.注入内存马(本文使用蚁剑)

6.蚁剑连接

总结

CVE-2016-4437 暴露了 Shiro 在安全设计上的严重缺陷,通过硬编码密钥和缺乏反序列化过滤,攻击者可轻易实现 RCE。开发人员需及时更新组件并遵循安全实践,避免类似漏洞。

相关推荐
星沁城18 分钟前
236. 二叉树的最近公共祖先
java·数据结构·leetcode·二叉树
oliveira-time1 小时前
Java 1.8(也称为Java 8)
java·开发语言
极小狐3 小时前
如何使用极狐GitLab 软件包仓库功能托管 maven?
java·运维·数据库·安全·c#·gitlab·maven
.生产的驴3 小时前
SpringBoot 集成滑块验证码AJ-Captcha行为验证码 Redis分布式 接口限流 防爬虫
java·spring boot·redis·分布式·后端·爬虫·tomcat
野犬寒鸦5 小时前
MySQL索引使用规则详解:从设计到优化的完整指南
java·数据库·后端·sql·mysql
思考的橙子5 小时前
Springboot之会话技术
java·spring boot·后端
钰爱&5 小时前
【Linux】POSIX 线程信号量与互斥锁▲
java·开发语言·jvm
黑匣子~7 小时前
java集成telegram机器人
java·python·机器人·telegram
竹小春逢十八8 小时前
Java常用类概述
java
weixin_437398218 小时前
RabbitMQ深入学习
java·分布式·后端·spring·spring cloud·微服务·rabbitmq