我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
零、Java反序列化漏洞
java的安全问题首屈一指的就是反序列化漏洞,可以执行命令啊,甚至直接getshell,所以趁着这个假期好好研究一下java的反序列化漏洞。另外呢,组里多位大佬对反序列化漏洞都有颇深的研究,借此机会,努力学习,作为狼群中的哈士奇希望成功的继续伪装下去,不被识破,哈哈哈哈!!!
参考文档:感谢所有参考文献的作者:
1、https://www.cnblogs.com/bencakes/p/6139477.html
2、https://www.cnblogs.com/ssooking/p/5875215.html
3、https://www.cnblogs.com/xdp-gacl/p/3777987.html
一、Java的序列化与反序列化:
在这里我们直接自己定义一个类,然后对这个类的对象(一个实例)进行序列化和发序列化测试。
1 //引入必要的java包文件
2 import java.io.*;
3
4 //创建测试类,注意要继承Serializable接口
5 class serialdemo implements Serializable{
6 public static int number;
7 public serialdemo(int inputnum) {
8 this.number = inputnum;
9 }
10 }
11
12 //主类
13 public class test{
14 //测试主类
15 public static void main(String[] args) throws IOException, ClassNotFoundException {
16 //主函数入口
17 serialdemo object = new serialdemo(100);
18 FileOutputStream fileoutputstream = new FileOutputStream("serail.ser");//创建文件写入对象
19 ObjectOutputStream outputstream = new ObjectOutputStream(fileoutputstream);//创建类型序列化通道对象
20 outputstream.writeObject(object);//把类对象(实例)序列化进入文件
21 outputstream.close();
22 FileInputStream fileinputstream = new FileInputStream("serail.ser");//从文件读取对象
23 ObjectInputStream inputstream = new ObjectInputStream(fileinputstream);//对象反序列化
24 // 通过反序列化恢复对象obj
25 serialdemo object2 = (serialdemo)inputstream.readObject();
26 System.out.println("反序列化后的对象的值:");
27 System.out.println(object2.number);
28 inputstream.close();
29 }
30 }
既然自己定义的类都可以了,那么默认的java存在的数据类型的实例当然也都可以啦~运行结果如下:
1 └─[$]> java test
2 反序列化后的对象的值:
3 100
二、对java序列化的详解:
1、api定位:
1 /*
2 java.io.ObjectOutputStream -> writeObject()
3 java.io.ObjectInputStream -> readObject()
4 序列化把对象序列化成字节流
5 反序列化读取字节流反序列化对象
6 */
2、实现Serializable和Externalizable接口的类才能序列化与反序列化。
3、java的反射机制:
/*
在java运行状态中
1.对于任何一个类,都能判断对象所属的类;
2.对于任何一个类,都能获取其所有的属性和方法;
3.对于任何一个对象,都能调用任意一个方法和属性;
*/
三、反序列化的漏洞原理概述:
1、由于很多站点或者RMI仓库等接口处存在java的反序列化功能,攻击者可以通过构造特定的恶意对象序列化后的流,让目标反序列化,从而达到自己的恶意预期行为,包括命令执行,甚至getshell等等。
2、Apache Commons Collections
这是开源小组Apache研发的一个Collections收集器框架,提供诸如list、set、queue等功能对象。这个框架中有一个接口,其中有一个实现该接口的类可以通过调用java的反射机制来调用任意函数,这个接口类是InvokerTransformer。这个架构的广泛