weblogic漏洞分析之CVE-2016-0638
字数 1590 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

3. 黑名单机制

isBlackListed方法对className和pkgName进行黑名单判断,匹配则返回true。黑名单包含:

  • org.apache.commons.collections.functors.ChainedTransformer
  • 其他相关危险类

四、漏洞原理

1. 原始漏洞流程

  1. 攻击者发送恶意T3协议数据包
  2. 服务器反序列化处理到InboundMsgAbbrev#readObject
  3. 通过ServerChannelInputStreamreadObject方法进行反序列化
  4. 最终触发恶意代码执行

2. 补丁后的防护机制

补丁通过重写resolveClass方法,在反序列化过程中进行黑名单检查,阻止危险类的反序列化。

五、绕过黑名单的方法

1. 绕过思路

寻找不在黑名单中的类,利用其反序列化过程中的二次反序列化机会。

2. 关键类:weblogic.jms.common.StreamMessageImpl

  • 不在黑名单中
  • readExternal方法会调用传入的ObjectInputStream的readObject方法
  • 可以作为二次反序列化的跳板

六、漏洞利用

1. 攻击工具

使用weblogic_cmd工具构造POC:

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

2. 攻击流程

  1. 构造CC1利用链并序列化
  2. 将序列化数据传入StreamMessageImpl对象
  3. 通过setDataBuffer方法设置数据
  4. StreamMessageImpl对象进行二次序列化
  5. 构造T3协议数据包并发送

3. 服务端处理流程

  1. 接收payload并进行反序列化
  2. InboundMsgAbbrev#resolveClass检查通过(因为StreamMessageImpl不在黑名单)
  3. 进入StreamMessageImpl#readExternal方法
  4. 触发二次反序列化,执行恶意代码

七、防御措施

  1. 及时安装官方补丁
  2. 限制T3协议的访问
  3. 监控异常反序列化行为
  4. 使用最新的WebLogic版本

八、总结

CVE-2016-0638漏洞利用WebLogic T3协议的反序列化机制,通过精心构造的StreamMessageImpl对象绕过黑名单检查,最终实现远程代码执行。理解该漏洞有助于更好地防御类似的反序列化漏洞。

九、参考链接

  1. 原文参考:https://xz.aliyun.com/t/8443
  2. weblogic_cmd工具:https://github.com/5up3rc/weblogic_cmd
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中新增了黑名单检查: 3. 黑名单机制 isBlackListed 方法对className和pkgName进行黑名单判断,匹配则返回true。黑名单包含: org.apache.commons.collections.functors.ChainedTransformer 其他相关危险类 四、漏洞原理 1. 原始漏洞流程 攻击者发送恶意T3协议数据包 服务器反序列化处理到 InboundMsgAbbrev#readObject 通过 ServerChannelInputStream 的 readObject 方法进行反序列化 最终触发恶意代码执行 2. 补丁后的防护机制 补丁通过重写 resolveClass 方法,在反序列化过程中进行黑名单检查,阻止危险类的反序列化。 五、绕过黑名单的方法 1. 绕过思路 寻找不在黑名单中的类,利用其反序列化过程中的二次反序列化机会。 2. 关键类:weblogic.jms.common.StreamMessageImpl 不在黑名单中 其 readExternal 方法会调用传入的ObjectInputStream的 readObject 方法 可以作为二次反序列化的跳板 六、漏洞利用 1. 攻击工具 使用weblogic_ cmd工具构造POC: 2. 攻击流程 构造CC1利用链并序列化 将序列化数据传入 StreamMessageImpl 对象 通过 setDataBuffer 方法设置数据 对 StreamMessageImpl 对象进行二次序列化 构造T3协议数据包并发送 3. 服务端处理流程 接收payload并进行反序列化 InboundMsgAbbrev#resolveClass 检查通过(因为 StreamMessageImpl 不在黑名单) 进入 StreamMessageImpl#readExternal 方法 触发二次反序列化,执行恶意代码 七、防御措施 及时安装官方补丁 限制T3协议的访问 监控异常反序列化行为 使用最新的WebLogic版本 八、总结 CVE-2016-0638漏洞利用WebLogic T3协议的反序列化机制,通过精心构造的 StreamMessageImpl 对象绕过黑名单检查,最终实现远程代码执行。理解该漏洞有助于更好地防御类似的反序列化漏洞。 九、参考链接 原文参考:https://xz.aliyun.com/t/8443 weblogic_ cmd工具:https://github.com/5up3rc/weblogic_ cmd