跳转至
#java  #java安全  #反序列化 
本文阅读量 

反序列化篇1#

反序列化方法的对比#

Java设计readObject的思路和PHP的wakeup不同点在于:readObject倾向于解决“反序列化时如何还原一个完整对象”这个问题,而PHP的wakeup更倾向于解决“反序列化后如何初始化这个对象”的 问题。

php反序列化#

java反序列化#

package top.longlone;  

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;  

import java.io.IOException;  
import java.io.ObjectInputStream;  
import java.io.ObjectOutputStream;  
import java.io.Serializable;  

public class Person implements Serializable {  
 public String name;  
 public int age;  

 public Person(String name, int age) {  
 this.name = name;  
 this.age = age;  
 }  

 private void writeObject(ObjectOutputStream s) throws IOException{  
 s.defaultWriteObject();  
 s.writeObject("This is a object");  
 }  

 private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {  
 s.defaultReadObject();  
 String message = (String) s.readObject();  
 System.out.println(message);  
 }  
}

package top.longlone;

import java.io.*;

public class SerializeDemo {
    private static String bytesToHexString(byte[] bytes) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            String strHex = Integer.toHexString(bytes[i]);
            if (strHex.length() > 3) {
                sb.append(strHex.substring(6));
            } else {
                if (strHex.length() < 2) {
                    sb.append("0" + strHex);
                } else {
                    sb.append(strHex);
                }
            }
        }
        return sb.toString();
    }


    public static void main(String[] args) {
        Person person = new Person("Tom", 18);
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(baos);
            out.writeObject(person);
            byte[] bytes = baos.toByteArray();
            out.close();
            baos.close();
            System.out.print(bytesToHexString(bytes));
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

这个特性就让Java的开发变得非常灵活。比如后面将会讲到的HashMap,其就是将Map中的所有键、 值都存储在objectAnnotation中,而并不是某个具体属性里。关于一些具体类是如何使用readObject方法的,我们后面在说到gadget的时候会详细分析。

python反序列化#

回到页面顶部