Web安全之Java反序列化
Posted mrob0t
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web安全之Java反序列化相关的知识,希望对你有一定的参考价值。
漏洞原理:
JAVA中的api实现
位置:
java.io.ObjectOutputStream
java.io.ObjectInputStream
序列化过程:
ObjectOutputStream类中的writeObject()方法:
对参数指定的obj对象进行序列化,把字节序列写到一个目标输出流中,按java的标准约定是给文件一个.ser扩展名
ObjectInputStreaml类中的readObject()方法:
从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回.
java序列化标志:
rO0AB开头,为java序列化base64加密后的数据.
aced开头,java序列化后的16进制数据.
简单实例Demo:
Main.java: package serializeDemo; import java.io.*; import java.io.Serializable; public class Main { public static void main(String[] args) throws Exception{ serializePerson(); //Person person=deserializePerson(); // System.out.print(person); } private static void serializePerson() throws IOException{ Person person = new Person("name:mrob0t",18); ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(new File("D:/person.txt")) ); oos.writeObject(person); System.out.println("person序列化成功!"); oos.close(); } private static Person deserializePerson() throws Exception{ ObjectInputStream ois = new ObjectInputStream( new FileInputStream(new File("D:/person.txt")) ); Person person=(Person)ois.readObject(); System.out.println("person对象反序列化成功"); return person; } } Person.java: package serializeDemo; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 3604972003323896788L; public Person(String n, int a){ String name; int age; name=n; age=a; } }
漏洞检测与利用:
黑盒检测:
a. 从流量中发现序列化的痕迹,关键字:ac ed 00 05,rO0AB b. Java RMI 的传输 100% 基于反序列化,Java RMI 的默认端口是1099端口
白盒代码审计:
关注以下函数:
ObjectInputStream.readObject
ObjectInputStream.readUnshared
XMLDecoder.readObject
Yaml.load
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject
利用:
payload生成器-ysoserial
自定义工具或脚本
以上是关于Web安全之Java反序列化的主要内容,如果未能解决你的问题,请参考以下文章