编写代码解释什么是Java继承和重写
继承
继承就是创建父类 然后创建子类在子类可以从父类继承所有的公共、受保护和默认访问权限的成员变量以及所有的行为并且也可以定义自己成员的变量和行为。
继承也可以更好的减少代码的重复性。
public class Grade {
private int score;
public Grade(int score) {
this.score = score;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
重写
重写就是子类覆盖掉了父类的方法,只使用自己定义的行为。
class Student {
String grade() { return "B"; }
}
class ExcellentStudent extends Student {
@Override
String grade() { return "A+"; }
}
public class Main {
public static void main(String[] args) {
System.out.println(Student().grade()); // prints "B"
System.out.println(ExcellentStudent().grade()); // prints "A+"
}
}
编写Java反序列化的函数实现对以自己姓名首字母命名类的序列化和反序列化
序列化
import java.io.Serializable;
public class Zzx implements Serializable {
private int id;
private String name;
public Zzx(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
反序列化
import java.io.*;
public class SerializeDemo {
public static void serialize(Zzx z) throws IOException {
FileOutputStream fileOut = new FileOutputStream("/tmp/serial.dat");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(z);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /tmp/serial.dat");
}
}
用自己的话结合java代码解释什么是反序列化漏洞
反序列化漏洞是指攻击者通过向应用程序发送恶意序列化数据,导致应用程序在反序列化过程中执行攻击者的恶意代码的一种安全漏洞。
反序列化是Java语言中的一个功能,它可以将对象从字节流中恢复出来。如果攻击者能够控制反序
列化的过程,他们就可以在反序列化的过程中注入自己的代码,从而破坏应用程序的安全性。
import java.io.ObjectInputStream;
import java.io.FileInputStream;
public class Test {
public static void main(String[] args) throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.ser"));
Object obj = ois.readObject();
ois.close();
}
}
在这个例子中,我们的程序打开一个名为"file.ser"的文件,并从中读取一个对象。然后它使用ObjectInputStream的readObject()方法将这个对象反序列化为Java对象。
然而,如果攻击者能够控制"file.ser"的内容,他们就可以在里面放置恶意代码,从而使反序列化过程执行他们的代码。
尝试通关pikachu靶场PHP反序列化漏洞,任意方式
靶场界面
查看源码
因为反序列化漏洞是代码审计得出的
这里的__construct魔法函数是在对象被创建的时候调用,但是如果直接输入的是被序列化后的内容,反序列化以后的内容并不算是创建而是相当于恢复,所以如果如果输入的是被序列化的内容,这里的魔法函数并不会被调用
isset()判断变量是否为空,如果不为空则往下继续
上传的内容赋值给$s
判断,如果对