導航:首頁 > 編程大全 > javaxml序列化工具

javaxml序列化工具

發布時間:2024-06-01 02:48:05

Ⅰ xmldecoder反序列化漏洞分析

java提供了很多xml文檔解析的類庫,包括dom4j,domj,SAX等庫,可以進行xml文檔的解析,這些庫的使用不當,會導致XXE漏洞的發生,但是這些類庫中,SAX庫允許自己去定義整個xml文檔處理的handler,可以在xml文檔解析的過程中,對解析出來的節點進行一些操作

而為java反序列化定義的handler,會導致一些java反序列化的問題的發生

poc:

獲取到文件內容之後,用XMLDecoder解析,在下面調用了readObject方法

進入readObject方法中

這里對文檔進行了解析,而XMLDecoder.this.handler其實就是
DocumentHandler

這個handler很重要,所有反序列化的操作都是在這個類中進行的

之類通過SAXParserFactory實例化了一個SAXParser的實例,並且調用了其中的parse方法

復現過java XXE漏洞的師傅應該看見過SAXParser的用法,它允許用戶自己去定義處理文檔的handler

可以看到,用戶可以將自己定義的Handler,只要這個類繼承了DefaultHandler,可以看一下官網的例子:

自己的Handler可以在解析的不同階段,進行不同的操作,這個特點就讓xml文檔成為了可以進行java序列化的載體,DocumentHandler這個handler就是處理xml文檔反序列化的

接下來,調用SAXParser對xml文檔進行解析,在對一些屬性的設置以後,真正的解析流程在XML11Configuration這個類中的parse方法中開始

首先是對實體的解析:

因為我們的文檔中並沒有xml實體,所以這一步不用關注

之後進行文檔的解析

進入到scanDocument函數中

這里通過next函數,解析了文檔,並且返回當前解析的狀態,整個文檔的具體解析過程在這個類的ContentDriver類中,裡面的解析過程很復雜,具體的解析過程不要過於關注,重點在解析出來的結果的處理上

當發現當前的文檔為根節點的時候,調用fContentDriver的next方法,在這里進行ROOT節點的解析

一直到的scanStartElement方法中

在之類對文檔進行解析,調用scanName解析出來第一個節點名為:java

之後尋找java節點的結束字元在哪,並且解析出來中間的所有屬性

在解析結束以後,會將這個節點中的所有屬性添加到fAttributes中

最後來到startElement函數中,可以認為fElementQName就是我們的節點名稱,fAttributes就是這個節點中所有屬性組成的一個字典

最後調用到DocumentHandler的startElement才到真正反序列化的地方

到這里,一個節點的解析就算結束了,頭都看大了,先附上一張調用棧,再到DocumentHandler中看具體的反序列化過程

在最後,調用了DocumentHandler.startElement函數,我們進入看一下

在這里會根據不同的節點實例化不同的節點Handler

this.handlers中尋找java節點對應的handler,可以看一下this.handlers裡面所有的handler都是什麼,它是一個HashMap,在屬性中有定義 private final Map<String, Class<? extends ElementHandler>> handlers = new HashMap();

在構造方法中,對handlers進行了賦值

這也就是XMLDecoder所有支持的節點類型,不同的節點會調用不同的ElementHandler進行處理,我們的java節點,應該是被JavaElementHandler處理的

回到startElement的方法中

在實例化JavaElementHandler類以後,調用了setParent將上一次的handler保存,這一步相當於將每一個節點的處理類串成了一個鏈

這一步獲取到所有的節點屬性,並且調用處理handler自己實現的addAttribute方法,可以看一下JavaElementHandler的addAttribute

這里通過我們設置的class屬性的內容,獲取了對應的類,也就是java.beans.XMLDecoder類的class

之後調用對應handler的startElement,而java的handler沒有操作,所以進行下一個節點的解析

下一個節點是object,具體解析流程就不再分析

object對應的Handler為ObjectElementHandler,可以發現,startElement中的重點其實就是每個Handler的addAttribute方法和startElement方法

調用父類的addAttribute方法

這一步獲得了ProcessBuilder的class

處理handler:ArrayElementHandler
addAttribute:

這里定義了數組元素的類型和數組大小

startElement:

這里實例化了一個數組元素,並且返回了一個ValueObject對象

void節點比較特殊,void節點其實是object節點的一個子類,它本身沒有定義什麼方法

我們可以不用過多的關注void節點的處理規則,只需要理解它的作用就是聲明一個變數就可以,可以這么理解:

在一個節點處理結束以後,會由內向外依次調用每個節點的endElement方法

比如我們的poc

在解析完touch的string節點的之後,觸發string的endElement,主要就是將將值設置為StringElementHandler的屬性

之後向ArrayElementHandler中的數組添加進去這個String,對每個element都會調用getValueObject方法,而其中

void節點的endElement很有意思

看一下getContextBean方法

這里會獲取上一個Handler的ValueObject的值,而這個ValueObject的value就是我們在屬性中定義的對象,void節點的上一個節點是array節點,我們在array節點中定義了一個大小為2的String數組,所以獲取到的ValueObject就為這個數組

因為我們只設置了void的屬性為index="0",所以會進入到var4=set的條件中

最後的Express類,相當於是對var3這個對象調用其中的var4的方法,參數為var2,這樣,就為這個String數組賦值了第一個值為touch

來到第二個void標簽

當來到 <void method="start"/>

進入到getContextBean

在這里調用了parent的getValueObject方法,也就是object標簽

獲取了ObjectElementHandler中的ProcessBuilder對象

最後調用start執行命令

Ⅱ 如何把xml內容轉換為java格式

使用XStream完成 java 類與 XML 互換。
下面代碼實現了以下種基本功能:
1. object類型轉換為xml類型,在控制台列印
2. xml類型轉換為object類型,在控制台列印
3. 將object類型轉換為xml類型,並寫入XML文件
4. 讀取XML文件,載入進相應Object類型
====================================================
1。載入 XStream 需要的jar包 xstream-1.4.2.jar
xpp3_min-1.1.4c.jar
xmlpull-1.1.3.1.jar

2。創建實體類User.java
package com.entity;
/**
* 實體類
*/
public class User {
private String userName;
private String password;
private String registeredTime;
public User() { }
public User(String userName, String passWord, String registeredTime) {
this.userName = userName;
this.passWord = passWord;
this.registeredTime = registeredTime;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getRegisteredTime() {
return registeredTime;
}
public void setRegisteredTime(String registeredTime) {
this.registeredTime = registeredTime;
}
}

3。編寫功能實現類
package com.switcher;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.entity.User;
import com.thoughtworks.xstream.XStream;
/**
*
* 使用 XStream不用任何映射就能實現多數 Java 對象的序列化。
* 在生成的 XML中對象名變成了元素名,類中的字元串組成了 XML中的元素內容。
* 使用 XStream 序列化的類不需要實現 Serializable 介面。
* XStream 是一種序列化工具而不是數據綁定工具
* 不能從XML 或者 XML Schema Definition (XSD) 文件生成類。
*/
public class SwitchXML {
/*
* XStream 不關心序列化/逆序列化的類的欄位的可見性。
* 序列化/逆序列化類的欄位不需要 getter 和 setter 方法。
* 序列化/逆序列化的類不需要有默認構造函數。
*/
private XStream xStream = new XStream();
private String xmlPath = "D:/userdata.xml";
// 1. obj -> xml(object類型轉換為xml類型)
public String printXML(User user) {
System.out.println("obj -> xml");
String xml = xStream.toXML(user);
System.out.println(xml);
return xml;
}
// 2. xml->obj(xml類型轉換為object類型,並列印)
public void printObj(String xml) {
System.out.println("xml -> obj");
User u = (User) xStream.fromXML(xml);
System.out.println(u.getUserName() + " " + u.getPassWord() + " " + u.getRegisteredTime());
}
// 3. 將object類型轉換為xml類型,並寫入XML文件(其他格式也可以,比如txt文件)
public void writerXML(User user) {
try {
FileOutputStream fs = new FileOutputStream(xmlPath);
xStream.toXML(user, fs);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
// 4. 讀取XML文件,載入進相應Object類型
public void readerXML() {
User user = new User();
FileInputStream fis = null;
try {
fis = new FileInputStream(xmlPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
xStream.fromXML(fis, user);
// 列印對象信息
System.out.println(user.toString());
// 列印對象的屬性值
System.out.println(user.getUserName() + "-" + user.getPassWord() + "-"
+ user.getRegisteredTime());
}
public static void main(String[] args) {
// 用戶名
String username = "admin";
// 密碼
String password = "admin";
// 注冊時間
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String registeredtime = format.format(now);
User user = new User(username, password, registeredtime);
SwitchXML switchXML = new SwitchXML();
// 1. object類型轉換為xml類型,在控制台列印
String xml = switchXML.printXML(user);
System.out.println("---------------------");
// 2. xml類型轉換為object類型,在控制台列印
switchXML.printObj(xml);
System.out.println("---------------------");
// 3. 將object類型轉換為xml類型,並寫入XML文件
switchXML.writerXML(user);
System.out.println("---------------------");
// 4. 讀取XML文件,載入進相應Object類型
switchXML.readerXML();
}
}

Ⅲ Java程序員常用的開發工具有哪些

在當今的互聯網時代中,Java語言越來越流行。關於Java的一些常用工具也需要我們不斷的掌握和理解。下面雲南java培訓為大家介紹,Java程序員常用的開發工具有哪些。


一、ServiceLoader-載入服務

Java開發人員通常希望區分使用什麼和創建什麼,昆明java課程培訓機構發現通常是通過創建一個描述組件操作的介面和使用某種中介創建組件實例。

二、SCanner

無數的Java開發工具可以幫助您構建解析器,許多函數語言已經成功地構建解析器庫(解析器選擇器)。但是,如果您想解析逗號分隔的值蠢鬥文件或空格分隔的文本文件呢?雲南java課程發現大多數工具都太大了,不能在這里使用,String.split()是不夠的。

三、Timer

Java.util.Timer和TimerTask類提供了一種方便且相對簡單的基於周期性或臨時延遲執行任務的方法。

四、StAX-解析XML文件

當許多Java開發人員首次使用XML時,分析XML文件的基本方法有兩種。雲南昆明IT培訓認為SAX解析器實際上是一個大型狀態機,程序員對事件調用一系列回調方法。DOM分析程序將整個XML文敏檔鄭檔添加到內存中,分離並分割成各個對象,並將它們連接起來形成橋頌樹。


閱讀全文

與javaxml序列化工具相關的資料

熱點內容
灌南數控編程怎麼學 瀏覽:957
系統apk圖標修改工具 瀏覽:121
蘋果6手機網路沒信號怎麼回事啊 瀏覽:378
手機掃描文件轉換成word 瀏覽:636
手機本地視頻的文件夾在哪裡 瀏覽:908
蘋果11無法安裝app找不到描述文件 瀏覽:363
咋新建cad文件 瀏覽:969
窩窩app怎麼樣自動關 瀏覽:228
蘋果電腦怎麼用wps生成多個文件夾 瀏覽:309
蘋果手機哪裡有賣 瀏覽:83
app登錄狀態為什麼不過期 瀏覽:160
win10創意者無法升級 瀏覽:59
如何查殺後門程序 瀏覽:498
定類數據可以用哪些描述統計方法 瀏覽:278
微信公眾號閱讀全文怎麼跳轉文件 瀏覽:935
迷你編程怎麼免費進入 瀏覽:354
蘋果應用設置密碼 瀏覽:21
windowsmac共享文件夾 瀏覽:274
數據安全性和固態硬碟哪個好 瀏覽:433
word為什麼圖片不能旋轉 瀏覽:732

友情鏈接