day3-java反序列化&php反序列化靶场&之前漏洞复习

本文详细介绍了Java的继承和重写概念,并通过代码展示了Java反序列化的过程及其潜在的安全风险。文章还探讨了PHP反序列化漏洞,并在pikachu靶场进行了实战演练,涉及SQL注入、XSS、文件上传等基础Web漏洞的演示。最后,作者分享了如何进行网页渗透测试的基本步骤。
摘要由CSDN通过智能技术生成

编写代码解释什么是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

判断,如果对

枚举类型是一个有限的取值集合,可以通过序列化和反序列化将其转换为字符串或数字。 序列化:将枚举类型转换为字符串或数字,以便于存储或传输。在C#中,可以使用Enum.ToString()方法将枚举转换为字符串,也可以使用(Enum)枚举值将枚举转换为整数。 反序列化:将字符串或数字转换为枚举类型。在C#中,可以使用Enum.Parse()方法将字符串转换为枚举类型,也可以使用(Enum)整数将整数转换为枚举类型。 以下是一个示例代码: ```csharp using System; enum DayOfWeek { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } class Program { static void Main(string[] args) { // 序列化 DayOfWeek day = DayOfWeek.Monday; string dayStr = day.ToString(); int dayInt = (int)day; Console.WriteLine($"dayStr: {dayStr}"); Console.WriteLine($"dayInt: {dayInt}"); // 反序列化 string dayStr2 = "Wednesday"; DayOfWeek day2 = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), dayStr2); int dayInt2 = 5; DayOfWeek day3 = (DayOfWeek)dayInt2; Console.WriteLine($"day2: {day2}"); Console.WriteLine($"day3: {day3}"); } } ``` 输出结果: ``` dayStr: Monday dayInt: 1 day2: Wednesday day3: Friday ``` 在上面的示例中,我们首先将枚举类型`DayOfWeek`的值序列化为字符串和整数,然后将其反序列化为枚举类型的值。注意,反序列化时需要使用`Enum.Parse()`方法将字符串转换为枚举类型,或者使用强制类型转换将整数转换为枚举类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值