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 环境搭建
补丁环境搭建
- 使用WebLogic 10.3.6环境
- 需要安装两个补丁包:
- 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.disableblacklistweblogic.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