java 反射和反序列化破解单例模式和填补漏洞方法
2019-09-22 23:07
1346 查看
反射:
public class Destruct { public static void main(String[] args) throws Exception { Class clazz=Class.forName("co.sxt.in.Design"); Constructor<Design> c=clazz.getDeclaredConstructor(); c.setAccessible(true); //访问私有属性跳过安全检查 Design d3=c.newInstance(); Design d4=c.newInstance(); System.out.println(d3); System.out.println(d4); //此时会创建两个不同的对象 }
反序列化
public class Destruct { public static void main(String[] args) throws Exception { //通过反序列化的方式构建对象 FileOutputStream fos=new FileOutputStream("d:/ak.txt"); ObjectOutputStream oos=new ObjectOutputStream(fos); oos.writeObject(d); oos.close(); fos.close(); FileInputStream fis=new FileInputStream("d:/ak.txt"); ObjectInputStream ois=new ObjectInputStream(fis); Object obj=ois.readObject(); if(obj instanceof Design) { Design d5=(Design)obj; System.out.println(d==d5); //通过返序列化创建了不同对象 }
}
弥补漏洞:
弥补反射漏洞
public class Design implements Serializable{ private static Design d; private Design() { f(d!=null) { throw new RuntimeException(); } }; public static synchronized Design getInstance() { if(d==null) { d=new Design(); } return d; } }
弥补反序列化漏洞:
public class Design implements Serializable{ private static Design d; private Design() { }; public static synchronized Design getInstance() { if(d==null) { d=new Design(); } return d; } 破解反序列化漏洞,反序列化时如果定义了返回对象的方法,则直接调方法返回,而不需要再反序列化一个新对象 private Object readResolve() throws ObjectStreamException{ return instance; } }
相关文章推荐
- 单例模式的漏洞,通过反射和序列化、反序列化来破解单例,以及如何避免这些漏洞
- Rhyme/Java 单例模式反射和反序列化漏洞解决
- Java设计模式(一):单例模式,防止反射和反序列化漏洞
- Rhyme/Java 设计模式之原型模式prototype通过clone方法和反序列化实现深复制
- JAVA反射示例四——结合代理模式的远程方法调用事例
- 设计模式之1.1 再谈反射 以及java当中通过配置文件得到类名字,并生成对象的方法
- 单例模式,防止反射和反序列化漏洞
- Java设计模式(一):单例模式,防止反射和反序列化漏洞
- 单例模式中解决反射和反序列化漏洞
- 单例模式的反射漏洞和反序列化漏洞代码实例
- 反射和反序列化破解单例模式以及解决方案
- 黑马程序员-JAVA学习之工厂方法模式,工厂类用反射功能实现
- 深入浅出Java模式设计之模板方法模式
- java调用.NET的webservice实例的二种方法soap方式axis模式
- JAVA反射示例三——远程方法调用事例
- java 反射入门-属性方法调用实例
- 利用java反射遍历类以及父类的方法
- Java 反射进行动态方法调用
- JAVA设计模式学习之----创建模式:工厂模式(工厂方法)
- 采用Java的反射机制编写的克隆类以及方法的代码