java_bean XMLDecoder
Posted 赛博少女
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java_bean XMLDecoder相关的知识,希望对你有一定的参考价值。
一、前言
上一篇跟完了java.io.ObjectInputStream的内部逻辑,今天来看下java.bean XMLDecoder。弱弱说,有点水,跟到后面懒得跟了23333333
二、准备
idea 起一个调试Demo,jdk 1.8.20
package xmldecoder;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.IOException;
import java.io.StringBufferInputStream;
import java.util.ArrayList;
import java.util.HashMap;
/**
* @auther Skay
* @date 2021/1/24 15:23
* @description
*/
public class Test {
public static void main(String[] args) throws IOException, InterruptedException {
String s = " " +
"
" class="java.lang.String" length="1"> " +
" index="0">calc " +
" " +
" method="start"> " +
" " +
"";
StringBufferInputStream stringBufferInputStream = new StringBufferInputStream(s);
XMLDecoder xmlDecoder = new XMLDecoder(stringBufferInputStream);
Object o = xmlDecoder.readObject();
System.out.println(o);
}
}
我懒,没有去跟writeobject,也就是一个对象怎么转化为xml文件的,所以断点直接下在java.beans.XMLDecoder#readObject,准备工作完成
三、调试
参阅了一些资料,跟漏洞主要相关的地方在com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentScanner#scanDocument,之前的方法只放上调用栈
scanDocument:454, XMLDocumentFragmentScannerImpl (com.sun.org.apache.xerces.internal.impl)
parse:848, XML11Configuration (com.sun.org.apache.xerces.internal.parsers)
parse:777, XML11Configuration (com.sun.org.apache.xerces.internal.parsers)
parse:141, XMLParser (com.sun.org.apache.xerces.internal.parsers)
parse:1213, AbstractSAXParser (com.sun.org.apache.xerces.internal.parsers)
parse:649, SAXParserImpl$JAXPSAXParser (com.sun.org.apache.xerces.internal.jaxp)
parse:333, SAXParserImpl (com.sun.org.apache.xerces.internal.jaxp)
run:375, DocumentHandler$1 (com.sun.beans.decoder)
run:372, DocumentHandler$1 (com.sun.beans.decoder)
doPrivileged:-1, AccessController (java.security)
doIntersectionPrivilege:75, ProtectionDomain$1 (java.security)
parse:372, DocumentHandler (com.sun.beans.decoder)
run:201, XMLDecoder$1 (java.beans)
run:199, XMLDecoder$1 (java.beans)
doPrivileged:-1, AccessController (java.security)
parsingComplete:199, XMLDecoder (java.beans)
readObject:250, XMLDecoder (java.beans)
main:27, Test (xmldecoder)
可以看到,这里整体是一个do while+switch结构
switch case结构中,核心处理是在next中,它会解析xml文件的每一行,然后调用事先初始化好的handler进行处理
handlers在com.sun.beans.decoder.DocumentHandler中初始化,保存在handlers这个HashMap集合中。每个handler以key value的形式存储,每个节点通过节点名称获取对应的handler
从next中的scanStartElement
到fDocumentHandler中的startElement
根据解析标签的不同,会调用不同的handler,解析,会调用ObjectElementHandler.
xmldecoder解析主要在于这些handler,包括weblogic cve漏洞的绕过方式也是基于某些handler继承的关系
有兴趣可以跟一下weblogic 关于xmldecoder的绕过及修复历史,干饭了,不想看了,而且weblogic搞得我脑子疼,不想再看它了,886
四、问题解答
五、参考链接
https://zhuanlan.zhihu.com/p/108754274
https://www.cnblogs.com/hetianlab/p/13534535.html
六、向列夫托尔斯泰学习
很累,想停止喜欢任何人任何事情,停止思考,停止劳动。
以上是关于java_bean XMLDecoder的主要内容,如果未能解决你的问题,请参考以下文章
(CVE-2017-10271 ) Weblogic XMLDecoder 反序列化