举例: 打印并生成ser.bin文件。 能看出来一点点知道是链分序列化但要怎样解出来具体内容就要反序列化读取或者分析源码了。 成功弹出计算机。 但实际上像 Runtime.getRuntime().exec("calc.exe");这种不会直接调用这种危险的链分方法的。 URLDNS与版本无关
,析利这个攻击是链分依赖于Java内置类。 URLDNS反序列化链只能发起DNS请求无法进行其他利用攻击可作为验证是析利否有反序列化漏洞。 使用bp生成个链接
。链分 先序列化运行一次尝试查看。 我们运行后发现 **hashmap.put(url,析利1);**put后便发起了dns请求即会导致我们收到dns后无法判断该dns是不是反序列化发出的。 ctrl+单机左键分别跟进函数 。 URL PUT hashmap.put----.> hashmap.put----.>hash----> hashmap.put----.>hash---->hashCode----> hashmap.put----.>hash---->hashCode---->getHostAddress----> 当HashMap传入一个URL时 ,会进行一次DNS解析,链分并将hashCode赋值为-1 当进行put时就会触发dns 。 调用hash(key)方法,此时也会判断key的hashMap,如果是云计算-1则会触发一次dns请求所以假设我们可以控制hashCode的值当初次进行hashmap.put(url,1);时我们将其改为其他值,hashmap.put(url,1)后再将其改回**-1**这样就可通过DNS判断是否反序列化.这个需要引入Java中的反射的知识。 Java中的反射是指在运行时动态地获取类的信息并操作类的成员(字段、方法、构造函数等)的能力
。通过反射 ,可以在运行时获取类的免费模板信息,如类的名称
、父类、接口、字段
、方法等 ,并且可以通过反射的API来动态地创建对象
、调用方法、访问和修改字段等 。 Java的反射机制主要由以下几个类和接口组成: 个人理解: 反射就是中途改一些定义好或者生成好的数值,当一个类。方法啥的高防服务器在被调用是我们可以通过反射机制创造出一个一样的并且这个我们可以对其属性值进行更改。 优点
: 缺点
: 在反序列化中他的作用就是改属性值。 注意
:jdk9一搜可能出现
。 链子
:HashMap类的put方法中调用了hash()方法->HashMap类的hash()方法中调用了hashCode()方法。 运行看一下: 发现序列化后并没有发起请求。 反序列化 可以观察到反序列化后发起了DNS请求
,这说明我们的URLDNS链制作完成,我们可以通过DNS请求判断是否发生反序列化。 动调观察一下 hashCode的值。 发现和我们设想的较为一致 。 自此URLDNS链算是结束了
,初始java反序列化感觉巨难但多看几遍自己调试几遍感觉也还可用哈!!! 本文作者:k5haioo, 转载请注明来自FreeBuf.COMJAVA URLDNS链分析利用
认识Java反序列化知识
复制Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的链分writerObject方法实现Serializable接口从而将对象转化为字节序列用于对对象数据进行存储转移1. URLDNS链
源码
调试
image-20230718150237706
image-20230718161400289
image-20230718161743988
k5hai-1311151548.cos.ap-shanghai.myqcloud.comk5hai-1311151548.cos.ap-shanghai.myqcloud.comk5hai-1311151548.cos.ap-shanghai.myqcloud.comimage-20230718150727563.png
k5hai-1311151548.cos.ap-shanghai.myqcloud.comk5hai-1311151548.cos.ap-shanghai.myqcloud.comimage-20230718150744365.png
image-20230718162025962
image-20230718162044876
image-20230718161400289
image-20230718163404677
image-20230718163555629Java中的反射
概念
反射优缺点
反射的用途
举例
源码 复制package org.example;//对象 import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; public class Person implements Serializable { private transient String name; private int age; public Person(){ }// 构造函数 public Person(String name, int age){ this.name = name; this.age = age; } @Override public String toString(){ return "Person{ " + "name=" + name + \ + ", age=" + age + }; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22. 复制package org.example;//反射 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Reflectiontest { public static void main(String[] args) throws Exception{ Person person = new Person();//new一个对象 //整个Class类对象 Class a = person.getClass(); //开始操作Class //a.newInstance();无参 //a.getConstructor();有参 //从原型class实例化对象 Constructor person_constructor = a.getConstructor(String.class,int.class); //选择合适的构造函数,根据参数类型选择构造函数(知道对象是一个名字一个年龄所以String.class,int.class) Person p = (Person) person_constructor.newInstance("小王",222); //实例化一个类对象 System.out.println(p);//打印 Field personfields =a.getDeclaredField("name");//获取Person类的私有字段name personfields.setAccessible(true);//获得私有成员的访问限制 personfields.set(p,"小李");//将name字段进行更改 System.out.println(p);//打印 //下面是其他用法 //获取类里面的属性 //同时编辑多行 alt+shift+ins // Field[] personfields = a.getFields(); //只能获得public类型的属性 // for(Field f:personfields){ //打印 // System.out.println(f); // } //Method[] aa=a.getMethods();//类或接口的所有公共方法 //for (Method n:aa){ //批量打印 // System.out.println(n); //} // Field[] personfields1 = a.getDeclaredFields(); //可以获取public,protected,private属性 // for(Field f:personfields1){ // System.out.println(f); // } //获取特定的属性 //Field namefield = a.getDeclaredField("sex"); //如果遇到private属性,需要用这个,表示可以修改;而public 和 protected可以直接修改 //namefield.setAccessible(true); // namefield.set(p,"aaa"); // System.out.println(p); //获取方法
,调用方法 //得到所有方法 // Method[] personmethods = a.getMethods(); // for(Method i:personmethods){ // System.out.println(i); // } //得到特定的方法 // Method actionmethod = a.getMethod("action", String.class); // actionmethod.invoke(p,"aaas"); // System.out.println(p); //如果要调用私有方法
,那么也是使用declared,还有setaccessible } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.
image-20230718184726771
image-20230718185016400URLDNS攻击链
image-20230718204643435
image-20230718205141538
image-20230718205903994