重写readObject来执行命令
1 | //Student |
1 | //Serialize |
1 | //Unserialize |
Java(反射基础)
Java反射是指在运行时动态地获取、检查和操作类的信息的机制。它允许程序在运行时通过类的名称来获取类的详细信息,包括类的构造函数、方法、字段等,并且可以在运行时动态地创建对象、调用方法和访问字段。反射机制使得程序可以在编译时无法确定具体类的情况下,通过名称来操作类,从而提供了更大的灵活性和动态性。
反射获取class对象
1 | public class test01 { |
反射获取构造方法
1 | import java.lang.reflect.Constructor; |
反射获取成员变量
1 | import java.lang.reflect.Field; |
URLDNS
poc
1 | import java.io.FileNotFoundException; |
1 | import java.io.FileInputStream; |
pop gadget
1 | Gadget Chain: |
可以理解为, 在序列化 HashMap 类的对象时, 为了减小序列化后的大小, 并没有将整个哈希表保存进去, 而是仅仅保存了所有内部存储的 key 和 value. 所以在反序列化时, 需要重新计算所有 key 的 hash, 然后与 value 一起放入哈希表中. 而恰好, URL 这个对象计算 hash 的过程中用了 getHostAddress 查询了 URL 的主机地址, 自然需要发出 DNS 请求.
我在学习URLDNS中遇到一个问题:尽管我setAccessible(true);还是会报错: Unable to make field private int java.net.URL.hashCode accessible: module java.base does not “opens java.net” to unnamed module @5b480cf9,解决方法:更换jdk版本到1.8
动态代理
在Java中,动态代理是一种机制,它允许在运行时创建代理对象,以代替原始对象执行特定的操作。代理对象可以拦截对原始对象的方法调用,并在调用前后执行额外的逻辑。
在Java中,动态代理是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。Proxy类提供了创建代理对象的静态方法,而InvocationHandler接口定义了代理对象的方法调用处理逻辑。
一个简单的案例
创建要被代理的class
1 | public class BigStart implements Star{ |
创建接口
1 | public interface Star { |
创建代理
1 | import java.lang.reflect.InvocationHandler; |
测试代理
1 | public class test { |