Java安全之Weblogic 2016-0638分析
字数 2057 2025-08-19 12:42:05

WebLogic CVE-2016-0638漏洞分析与利用指南

0x00 漏洞概述

CVE-2016-0638是WebLogic服务器中的一个反序列化漏洞,它是对CVE-2015-4852漏洞补丁的绕过。该漏洞允许攻击者通过T3协议发送恶意序列化数据,在目标服务器上执行任意代码。

0x01 环境搭建

补丁环境搭建

  1. 使用WebLogic 10.3.6环境
  2. 需要安装两个补丁包:
    • p20780171_1036_Generic
    • p22248372_1036012_Generic
    • (注:p21984589_1036_Generic是这两个补丁的集成版)

安装步骤:

# 将补丁包复制到容器中
docker cp ../p20780171_1036_Generic weblogic1036jdk7u21:/p20780171_1036_Generic
docker cp ../p22248372_1036012_Generic weblogic1036jdk7u21:/p22248372_1036012_Generic

# 进入容器
docker exec -it weblogic1036jdk7u21 /bin/bash

# 设置补丁安装环境
cd /u01/app/oracle/middleware/utils/bsu
mkdir cache_dir
vi bsu.sh  # 编辑MEM_ARGS参数为1024

# 安装第一个补丁
cp /p20780171_1036_Generic/* cache_dir/
./bsu.sh -install -patch_download_dir=/u01/app/oracle/middleware/utils/bsu/cache_dir/ -patchlist=EJUW -prod_dir=/u01/app/oracle/middleware/wlserver/

# 安装第二个补丁
cp /p22248372_1036012_Generic/* cache_dir/
./bsu.sh -install -patch_download_dir=/u01/app/oracle/middleware/utils/bsu/cache_dir/ -patchlist=ZLNA -prod_dir=/u01/app/oracle/middleware/wlserver/ --verbose

# 重启WebLogic服务
/u01/app/oracle/Domains/ExampleSilentWTDomain/bin/startWebLogic.sh

远程调试准备

# 从容器中复制必要的库文件
mkdir wlserver1036
mkdir coherence_3.7
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/modules ./wlserver1036
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/wlserver/server/lib ./wlserver1036
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib

0x02 补丁分析

补丁主要修改了以下类:

  • weblogic.rjvm.InboundMsgAbbrev.class :: ServerChannelInputStream
  • weblogic.rjvm.MsgAbbrevInputStream.class
  • weblogic.iiop.Utils.class

黑名单机制

补丁在resolveClass方法中添加了黑名单检查:

if (className != null && className.length() > 0 && ClassFilter.isBlackListed(className)) {
    throw new InvalidClassException("Unauthorized deserialization attempt", className);
}

黑名单列表(存储在ClassFilter类中):

  • org.apache.commons.collections.functors
  • com.sun.org.apache.xalan.internal.xsltc.trax
  • javassist
  • org.codehaus.groovy.runtime.ConvertedClosure
  • org.codehaus.groovy.runtime.ConversionHandler
  • org.codehaus.groovy.runtime.MethodClosure

黑名单可以通过以下系统属性配置:

  • weblogic.rmi.disableblacklist
  • weblogic.rmi.disabledefaultblacklist

0x03 漏洞利用原理

绕过思路

  1. 寻找一个不在黑名单中的类,该类在readObjectreadExternal方法中会创建自己的ObjectInputStream对象
  2. 将恶意序列化数据封装在这个类的对象中
  3. 当这个类被反序列化时,它会反序列化封装的数据,从而绕过黑名单检查

关键类:weblogic.jms.common.StreamMessageImpl

StreamMessageImpl类的readExternal方法可以接收序列化数据作为参数,并在内部进行反序列化操作。由于StreamMessageImpl本身不在黑名单中,可以绕过补丁的防护。

利用流程:

  1. 将反序列化对象封装进StreamMessageImpl
  2. StreamMessageImpl进行序列化,生成payload
  3. 通过T3协议发送payload
  4. 服务器反序列化StreamMessageImpl对象
  5. StreamMessageImpl调用readExternal方法反序列化封装的恶意对象
  6. 执行恶意代码

0x04 漏洞利用工具分析

使用weblogic_cmd工具生成payload:

  1. 工具首先生成Commons Collections利用链的payload
  2. 将payload封装到StreamMessageImpl对象中
  3. StreamMessageImpl对象进行序列化
  4. 构造T3协议数据包发送payload

关键代码路径:

  1. SerialDataGenerator.serialBlindDatas - 生成序列化数据
  2. BypassPayloadSelector.selectBypass - 选择绕过方式
  3. Serializables.serialize - 序列化操作
  4. StreamMessageImpl.setDataBuffer - 封装payload

0x05 漏洞验证与调试

调试步骤

  1. weblogic.rjvm.InboundMsgAbbrev.ServerChannelInputStream.resolveClass设置断点
  2. 观察传入的className参数应为weblogic.jms.common.StreamMessageImpl
  3. StreamMessageImpl.readExternal设置断点
  4. 观察反序列化过程:
    • 首先反序列化StreamMessageImpl对象
    • 然后StreamMessageImpl内部反序列化封装的恶意对象
    • 最终触发恶意代码执行

0x06 防护措施

  1. 及时安装官方发布的最新补丁
  2. 限制T3协议的访问(可通过防火墙或WebLogic配置)
  3. 监控异常的反序列化操作
  4. 考虑使用Java安全管理器限制敏感操作

参考链接

  1. https://xz.aliyun.com/t/8443
  2. https://www.anquanke.com/post/id/224343
WebLogic CVE-2016-0638漏洞分析与利用指南 0x00 漏洞概述 CVE-2016-0638是WebLogic服务器中的一个反序列化漏洞,它是对CVE-2015-4852漏洞补丁的绕过。该漏洞允许攻击者通过T3协议发送恶意序列化数据,在目标服务器上执行任意代码。 0x01 环境搭建 补丁环境搭建 使用WebLogic 10.3.6环境 需要安装两个补丁包: p20780171_ 1036_ Generic p22248372_ 1036012_ Generic (注:p21984589_ 1036_ Generic是这两个补丁的集成版) 安装步骤: 远程调试准备 0x02 补丁分析 补丁主要修改了以下类: weblogic.rjvm.InboundMsgAbbrev.class :: ServerChannelInputStream weblogic.rjvm.MsgAbbrevInputStream.class weblogic.iiop.Utils.class 黑名单机制 补丁在 resolveClass 方法中添加了黑名单检查: 黑名单列表(存储在 ClassFilter 类中): org.apache.commons.collections.functors com.sun.org.apache.xalan.internal.xsltc.trax javassist org.codehaus.groovy.runtime.ConvertedClosure org.codehaus.groovy.runtime.ConversionHandler org.codehaus.groovy.runtime.MethodClosure 黑名单可以通过以下系统属性配置: weblogic.rmi.disableblacklist weblogic.rmi.disabledefaultblacklist 0x03 漏洞利用原理 绕过思路 寻找一个不在黑名单中的类,该类在 readObject 或 readExternal 方法中会创建自己的 ObjectInputStream 对象 将恶意序列化数据封装在这个类的对象中 当这个类被反序列化时,它会反序列化封装的数据,从而绕过黑名单检查 关键类:weblogic.jms.common.StreamMessageImpl StreamMessageImpl 类的 readExternal 方法可以接收序列化数据作为参数,并在内部进行反序列化操作。由于 StreamMessageImpl 本身不在黑名单中,可以绕过补丁的防护。 利用流程: 将反序列化对象封装进 StreamMessageImpl 对 StreamMessageImpl 进行序列化,生成payload 通过T3协议发送payload 服务器反序列化 StreamMessageImpl 对象 StreamMessageImpl 调用 readExternal 方法反序列化封装的恶意对象 执行恶意代码 0x04 漏洞利用工具分析 使用 weblogic_cmd 工具生成payload: 工具首先生成Commons Collections利用链的payload 将payload封装到 StreamMessageImpl 对象中 对 StreamMessageImpl 对象进行序列化 构造T3协议数据包发送payload 关键代码路径: SerialDataGenerator.serialBlindDatas - 生成序列化数据 BypassPayloadSelector.selectBypass - 选择绕过方式 Serializables.serialize - 序列化操作 StreamMessageImpl.setDataBuffer - 封装payload 0x05 漏洞验证与调试 调试步骤 在 weblogic.rjvm.InboundMsgAbbrev.ServerChannelInputStream.resolveClass 设置断点 观察传入的 className 参数应为 weblogic.jms.common.StreamMessageImpl 在 StreamMessageImpl.readExternal 设置断点 观察反序列化过程: 首先反序列化 StreamMessageImpl 对象 然后 StreamMessageImpl 内部反序列化封装的恶意对象 最终触发恶意代码执行 0x06 防护措施 及时安装官方发布的最新补丁 限制T3协议的访问(可通过防火墙或WebLogic配置) 监控异常的反序列化操作 考虑使用Java安全管理器限制敏感操作 参考链接 https://xz.aliyun.com/t/8443 https://www.anquanke.com/post/id/224343