weblogic漏洞分析之CVE-2016-0638
字数 1774 2025-08-05 00:15:46

WebLogic漏洞分析之CVE-2016-0638教学文档

一、漏洞概述

CVE-2016-0638是Oracle WebLogic Server中的一个远程代码执行漏洞,存在于WebLogic的T3协议反序列化过程中。攻击者可以通过构造恶意的T3协议请求,在目标服务器上执行任意代码。

二、环境搭建

1. 基础环境准备

  • 使用前一篇文章的环境(参考:https://www.cnblogs.com/yyhuni/p/15137095.html)
  • 需要下载并安装两个补丁:
    • p20780171_1036_Generic
    • p22248372_1036012_Generic

2. 补丁安装步骤

  1. 将补丁复制到Docker容器中:
docker cp ./p22248372_1036012_Generic/ d1b6be39e32e:/home/
docker cp ./p20780171_1036_Generic d1b6be39e32e:/home/
  1. 进入容器并安装补丁:
docker exec -it d1b6be39e32e /bin/bash
cd /root/Oracle/Middleware/utils/bsu
mkdir cache_dir
cp /home/p20780171_1036_Generic/* ./cache_dir/
cp /home/p22248372_1036012_Generic/* ./cache_dir/
vi bsu.sh    # 编辑MEM_ARGS参数为1024
./bsu.sh -install -patch_download_dir=/root/Oracle/Middleware/utils/bsu/cache_dir/ -patchlist=EJUW -prod_dir=/root/Oracle/Middleware/wlserver_10.3 -verbose
./bsu.sh -install -patch_download_dir=/root/Oracle/Middleware/utils/bsu/cache_dir/ -patchlist=ZLNA -prod_dir=/root/Oracle/Middleware/wlserver_10.3 -verbose
  1. 重启服务:
docker restart d1b6be39e32e

三、补丁分析

1. 补丁关键位置

补丁主要修改了以下类:

  • weblogic.rjvm.InboundMsgAbbrev.class中的ServerChannelInputStream
  • weblogic.rjvm.MsgAbbrevInputStream.class
  • weblogic.iiop.Utils.class

2. 黑名单机制

InboundMsgAbbrev中新增了ClassFilter.isBlackListed判断,用于检查类是否在黑名单中。

黑名单检查逻辑:

if (ClassFilter.isBlackListed(className) || ClassFilter.isBlackListed(pkgName)) {
    throw new InvalidClassException(...);
}

黑名单包含的类:

  • org.apache.commons.collections.functors.ChainedTransformer
  • 其他危险类(具体见补丁代码)

3. 反序列化流程

  1. 攻击者发送伪造的T3协议数据包
  2. 服务器反序列化处理到InboundMsgAbbrev#readObject方法
  3. 通过switch分发到case0,调用ServerChannelInputStreamreadObject方法
  4. ServerChannelInputStream继承ObjectInputStream并重写resolveClass方法进行黑名单检查

四、绕过黑名单的方法

1. 寻找替代类

由于黑名单机制不完善,可以寻找不在黑名单中的类作为跳板。weblogic.jms.common.StreamMessageImpl类被发现可以利用。

2. StreamMessageImpl利用原理

StreamMessageImpl#readExternal方法中会调用ObjectInputStreamreadObject方法:

public void readExternal(ObjectInput var1) throws IOException, ClassNotFoundException {
    // ...
    switch(var2) {
        case 1:
            ObjectInputStream var5 = new ObjectInputStream(new BufferInputStream(var4));
            this.payload = var5.readObject();
            // ...
    }
}

五、漏洞利用分析

1. 攻击机构造POC

使用weblogic_cmd工具构造POC:

-H "192.168.202.129" -C "touch /tmp/success" -B -os linux

2. POC构造流程

  1. 将CC1利用链序列化
  2. 创建StreamMessageImpl对象并调用setDataBuffer方法设置payload
  3. StreamMessageImpl对象进行序列化
  4. StreamMessageImpl#writeExternal方法将payload写入ObjectOutputStream
  5. 构造T3协议并发送给服务器

3. 服务端执行流程

  1. 接收payload并反序列化
  2. InboundMsgAbbrev#resolveClass检查通过(StreamMessageImpl不在黑名单)
  3. 执行StreamMessageImpl#readExternal
  4. readExternal中创建新的ObjectInputStream并执行readObject
  5. 触发AnnotationInvocationHandler#readObject执行恶意代码

六、总结

  1. 漏洞本质:T3协议反序列化漏洞
  2. 补丁机制:通过黑名单过滤危险类
  3. 绕过方法:利用StreamMessageImpl类作为跳板,间接执行黑名单中的类
  4. 影响范围:特定版本的WebLogic Server

七、参考链接

  1. 原文参考:https://xz.aliyun.com/t/8443
  2. weblogic_cmd工具:https://github.com/5up3rc/weblogic_cmd
  3. 反序列化详细过程:https://www.cnblogs.com/yyhuni/p/15127416.html
WebLogic漏洞分析之CVE-2016-0638教学文档 一、漏洞概述 CVE-2016-0638是Oracle WebLogic Server中的一个远程代码执行漏洞,存在于WebLogic的T3协议反序列化过程中。攻击者可以通过构造恶意的T3协议请求,在目标服务器上执行任意代码。 二、环境搭建 1. 基础环境准备 使用前一篇文章的环境(参考:https://www.cnblogs.com/yyhuni/p/15137095.html) 需要下载并安装两个补丁: p20780171_ 1036_ Generic p22248372_ 1036012_ Generic 2. 补丁安装步骤 将补丁复制到Docker容器中: 进入容器并安装补丁: 重启服务: 三、补丁分析 1. 补丁关键位置 补丁主要修改了以下类: weblogic.rjvm.InboundMsgAbbrev.class 中的 ServerChannelInputStream weblogic.rjvm.MsgAbbrevInputStream.class weblogic.iiop.Utils.class 2. 黑名单机制 在 InboundMsgAbbrev 中新增了 ClassFilter.isBlackListed 判断,用于检查类是否在黑名单中。 黑名单检查逻辑: 黑名单包含的类: org.apache.commons.collections.functors.ChainedTransformer 其他危险类(具体见补丁代码) 3. 反序列化流程 攻击者发送伪造的T3协议数据包 服务器反序列化处理到 InboundMsgAbbrev#readObject 方法 通过 switch 分发到 case0 ,调用 ServerChannelInputStream 的 readObject 方法 ServerChannelInputStream 继承 ObjectInputStream 并重写 resolveClass 方法进行黑名单检查 四、绕过黑名单的方法 1. 寻找替代类 由于黑名单机制不完善,可以寻找不在黑名单中的类作为跳板。 weblogic.jms.common.StreamMessageImpl 类被发现可以利用。 2. StreamMessageImpl利用原理 StreamMessageImpl#readExternal 方法中会调用 ObjectInputStream 的 readObject 方法: 五、漏洞利用分析 1. 攻击机构造POC 使用 weblogic_cmd 工具构造POC: 2. POC构造流程 将CC1利用链序列化 创建 StreamMessageImpl 对象并调用 setDataBuffer 方法设置payload 对 StreamMessageImpl 对象进行序列化 StreamMessageImpl#writeExternal 方法将payload写入 ObjectOutputStream 构造T3协议并发送给服务器 3. 服务端执行流程 接收payload并反序列化 InboundMsgAbbrev#resolveClass 检查通过( StreamMessageImpl 不在黑名单) 执行 StreamMessageImpl#readExternal 在 readExternal 中创建新的 ObjectInputStream 并执行 readObject 触发 AnnotationInvocationHandler#readObject 执行恶意代码 六、总结 漏洞本质:T3协议反序列化漏洞 补丁机制:通过黑名单过滤危险类 绕过方法:利用 StreamMessageImpl 类作为跳板,间接执行黑名单中的类 影响范围:特定版本的WebLogic Server 七、参考链接 原文参考:https://xz.aliyun.com/t/8443 weblogic_ cmd工具:https://github.com/5up3rc/weblogic_ cmd 反序列化详细过程:https://www.cnblogs.com/yyhuni/p/15127416.html