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

三:漏洞原理分析
1. RememberMe 机制流程
用户登录时若勾选"记住我",Shiro 会执行以下流程生成 Cookie:
-
序列化身份信息
用户身份(如PrincipalCollection
)被序列化为字节数组。 -
AES 加密
使用硬编码密钥kPH+bIxk5D2deZiIxcaaaA==
对序列化数据进行 AES-CBC 加密。 -
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 时,会进行以下操作:
-
Base64 解码
-
AES 解密
使用固定密钥解密数据。 -
反序列化
解密后的字节流直接反序列化为对象,未做安全校验。
反序列化入口(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。开发人员需及时更新组件并遵循安全实践,避免类似漏洞。