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。开发人员需及时更新组件并遵循安全实践,避免类似漏洞。

相关推荐
浮游本尊10 分钟前
Java学习第22天 - 云原生与容器化
java
渣哥2 小时前
原来 Java 里线程安全集合有这么多种
java
间彧2 小时前
Spring Boot集成Spring Security完整指南
java
间彧2 小时前
Spring Secutiy基本原理及工作流程
java
Java水解4 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆6 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学6 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole6 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊6 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端