Day34:安全开发-JavaEE应用&反射机制&攻击链&类对象&成员变量方法&构造方 ...

打印 上一主题 下一主题

主题 790|帖子 790|积分 2370

一,Java-反射

1,反射的寄义:

反射的意思就是,在代码运行的时候,还能动态的获得和修改成员变量,操纵成员方法和构造方法。而不是得将程序停掉,再来改源代码里面的东西。对成员变量,成员方法和构造方法的信息进行的编程操纵可以明白为反射机制。
2,反射的意义:

在运行时获得程序或程序集中每一个类型的成员和成员的信息,从而动态的创建、修改、调用、获取其属性,而不需要事先知道运行的对象是谁。划重点:在运行时而不是编译时。(不改变原有代码逻辑,自行运行的时候动态创建和编译即可)
3,安全应用场景:

(1)构造利用链,触发命令执行
(2)反序列化中的利用链构造




4,Java-反射-Class对象类获取
  1. //1、根据类名:类名.class
  2. Class userClass=User.class;
  3. //2、根据对象:对象.getClass()
  4. User user=new User();
  5. Class aClass=user.getClass();
  6. //3、根据全限定类名:Class.forName("全路径类名")
  7. Class aClass1=Class.forName("com.example.reflectdemo.User");
  8. //4、通过类加载器获得Class对象://ClassLoader.getSystemClassLoader();
  9. ClassLoader clsload=ClassLoader.getSystemClassLoader();
  10. Class aClass2=clsload.loadClass("com.example.reflectdemo.User")
复制代码
反射实验:创建一个User类,包含成员变量和成员方法,构造方法,便于获取反射所对应需要
User.java文件
  1. package com.example;
  2. public class User {
  3.     //成员变量
  4.     public String name="xiaodi";
  5.     public int age = 31;
  6.     private String gender="man";
  7.     protected String job="sec";
  8.     //构造方法
  9.     public User(){
  10.         //System.out.println("无参数");
  11.     }
  12.     public User(String name){
  13.         System.out.println("我的名字"+name);
  14.     }
  15.     private User(String name,int age){
  16.         System.out.println(name);
  17.         System.out.println(age);
  18.     }
  19.     //成员方法
  20.     public void userinfo(String name,int age,String gender,String job){
  21.         this.job=job;
  22.         this.age=age;
  23.         this.name = name;
  24.         this.gender=gender;
  25.     }
  26.     protected void users(String name,String gender){
  27.         this.name = name;
  28.         this.gender=gender;
  29.         System.out.println("users成员方法:"+name);
  30.         System.out.println("users成员方法:"+gender);
  31.     }
  32. }
复制代码
GetClass.java文件
  1. package com.example;
  2. public class GetClass {
  3.     public static void main(String[] args) throws ClassNotFoundException {
  4.         //1、根据全限定类名:Class.forName("全路径类名")
  5.         Class aClass = Class.forName("com.example.User");
  6.         System.out.println(aClass);
  7.         //2、根据类名:类名.class
  8.         Class userClass = User.class;
  9.         System.out.println(userClass);
  10.         //3、根据对象:对象.getClass()
  11.         User user= new User();
  12.         Class aClass1 = user.getClass();
  13.         System.out.println(aClass1);
  14.         //4、通过类加载器获得Class对象://ClassLoader.getSystemClassLoader().loadClass("全路径类名");
  15.         ClassLoader clsload=ClassLoader.getSystemClassLoader();
  16.         Class aClass2 = clsload.loadClass("com.example.User");
  17.         System.out.println(aClass2);
  18.     }
  19. }
复制代码
5,Java-反射-Field成员变量类获取
  1. //Class aClass = Class.forName("com.example.reflectdemo.User");
  2. //获取公共成员变量对象
  3. //        Field[] fields=aClass.getFields();
  4. //        for(Field f:fields){
  5. //            System.out.println(f);
  6. //        }
  7. //获取所有成员变量对象
  8. //        Field[] fields=aClass.getDeclaredFields();
  9. //        for(Field f:fields){
  10. //            System.out.println(f);
  11. //        }
  12. //获取公共,私有单个成员变量对象
  13. //        Field field=aClass.getField("age");
  14. //        Field field=aClass.getDeclaredField("gender");
  15. //        System.out.println(field);
  16. //城边变量值获取和赋值
  17. //        User u = new User();
  18. //        Field field=aClass.getField("age");
  19. //        field.set(u,30);
  20. //        Object a=field.get(u);
  21. //        System.out.println(a);
复制代码
GetField.java
  1. package com.example;
  2. import java.lang.reflect.Field;
  3. public class GetField {
  4.     public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
  5.         Class aClass = Class.forName("com.example.User");
  6.         //获取公共的成员变量
  7. //        Field[] fields = aClass.getFields();
  8. //        for(Field fd:fields){
  9. //            System.out.println(fd);
  10. //        }
  11.         //获取所有的成员变量
  12. //        Field[] fields = aClass.getDeclaredFields();
  13. //        for(Field fd:fields){
  14. //            System.out.println(fd);
  15. //        }
  16.         //获取单个的公共成员变量
  17.         Field name = aClass.getField("name");
  18.         System.out.println(name);
  19.         //获取单个的成员变量
  20.         Field gender = aClass.getDeclaredField("gender");
  21.         System.out.println(gender);
  22.         //获取公共的成员变量age的值
  23.         User u = new User();
  24.         Field field=aClass.getField("age");
  25.         //取值
  26.         Object a=field.get(u);
  27.         System.out.println(a);
  28.         //赋值
  29.         field.set(u,32);
  30.         Object aa=field.get(u);
  31.         System.out.println(aa);
  32.     }
  33. }
复制代码
二,Java-反射-Constructor构造方法类获取
  1.     //Class aClass = Class.forName("com.example.reflectdemo.User");
  2.     //返回所有公共构造方法对象的数组
  3.     //        Constructor[] constructors = aClass.getConstructors();
  4.     //        for(Constructor con:constructors){
  5.     //            System.out.println(con);
  6.     //        }
  7.     //返回所有构造方法对象的数组
  8.     //        Constructor[] constructors = aClass.getDeclaredConstructors();
  9.     //        for(Constructor con:constructors){
  10.     //            System.out.println(con);
  11.     //        }
  12.     //返回单个公共构造方法对象
  13.     //        Constructor con1=aClass.getConstructor();
  14.     //        Constructor con1=aClass.getConstructor(String.class);
  15.     //        System.out.println(con1);
  16.     //返回单个构造方法对象
  17.     //        Constructor con2=aClass.getDeclaredConstructor(int.class);
  18.     //Constructor con2=aClass.getDeclaredConstructor(String.class,int.class, String.class);
  19.     //        System.out.println(con2);
  20.     //        Constructor con2=aClass.getDeclaredConstructor(int.class);
  21.     //        con2.setAccessible(true);
  22.     //        User uu=(User) con2.newInstance("xiaodi",30,"man");
  23.     //        System.out.println(uu);
复制代码
GetConstructor.java
  1. package com.example;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;
  4. public class GetConstructor {
  5.     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
  6.         Class aClass = Class.forName("com.example.User");
  7.         //获取公共的构造方法
  8. //        Constructor[] constructors = aClass.getConstructors();
  9. //        for (Constructor con:constructors){
  10. //            System.out.println(con);
  11. //        }
  12.         //获取所有的构造方法
  13. //        Constructor[] constructors = aClass.getDeclaredConstructors();
  14. //        for (Constructor con:constructors){
  15. //            System.out.println(con);
  16. //        }
  17.         //获取单个的公共的构造方法
  18. //        Constructor constructor = aClass.getConstructor(String.class);
  19. //        System.out.println(constructor);
  20. //
  21. //        //获取单个的构造方法
  22. //        Constructor con1 = aClass.getDeclaredConstructor(String.class,int.class);
  23. //        System.out.println(con1);
  24.         //对构造方法进行操作(两个参数string,int)
  25. //        Constructor con2=aClass.getDeclaredConstructor(String.class,int.class);
  26. //        //临时开启对私有的访问
  27. //        con2.setAccessible(true);
  28. //        User uu=(User) con2.newInstance("xiaodigaygay",40);
  29. //        System.out.println(uu);
  30.         //对构造方法进行执行(1个参数strin)
  31.         Constructor con2=aClass.getConstructor(String.class);
  32.         con2.newInstance("xiaodigaygay");
  33.     }
  34. }
复制代码
三,Java-反射-Method成员方法类获取
  1. //Class aClass = Class.forName("com.example.reflectdemo.User");
  2. //返回所有公共成员方法对象的数组,包括继承的
  3. //        Method[] methods = aClass.getMethods();
  4. //        for (Method me:methods){
  5. //            System.out.println(me);
  6. //        }
  7. //返回所有成员方法对象的数组,不包括继承的
  8. //        Method[] methods = aClass.getDeclaredMethods();
  9. //        for (Method me:methods){
  10. //            System.out.println(me);
  11. //        }
  12. //返回单个公共成员方法对象
  13. //        Method methods = aClass.getMethod("getName");
  14. //        System.out.println(methods);
  15. //        Method methods = aClass.getMethod("setName", String.class);
  16. //        System.out.println(methods);
  17. //返回单个成员方法对象
  18. //        Method methods = aClass.getDeclaredMethod("UserInfo", String.class, int.class, String.class);
  19. //        System.out.println(methods);
  20. //运行方法invoke
  21. //        Method methods = aClass.getDeclaredMethod("UserInfo", String.class, int.class, String.class);
  22. //        User u = new User();
  23. //        //私有需要开启临时
  24. //        methods.setAccessible(true);
  25. //        methods.invoke(u,"xiaodi",18,"man");
复制代码
GetMethod.java
  1. package com.example;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. public class GetMethod {
  6.     public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
  7.         Class aClass = Class.forName("com.example.User");
  8.         //获取包括继承的公共成员方法
  9. //        Method[] methods = aClass.getMethods();
  10. //        for(Method me:methods){
  11. //            System.out.println(me);
  12. //        }
  13.         //获取不包括继承的所有成员方法
  14. //        Method[] methods = aClass.getDeclaredMethods();
  15. //        for(Method me:methods){
  16. //            System.out.println(me);
  17. //        }
  18.         //获取单个的成员方法
  19. //        Method users = aClass.getDeclaredMethod("users", String.class,String.class);
  20. //        System.out.println(users);
  21.         // 对成员方法进行执行
  22.         // invoke() 方法用于调用指定对象的方法,并传递相应的参数。
  23.         User u = new User();
  24.         Method users = aClass.getDeclaredMethod("users", String.class,String.class);
  25.         users.invoke(u,"xiaodigay","gay1");
  26.     }
  27. }
复制代码
四,Java-反射-不安全命令执行&反序列化链构造
  1. 1 、反射实现 - 命令执行
  2. -原型:
  3. Runtime.getRuntime().exec("calc");
  4. -反射:
  5. Class aClass = Class.forName("java.lang.Runtime");
  6. Method[] methods = aClass.getMethods();
  7. for (Method me:methods){
  8. System.out.println(me);
  9. }
  10. Method exec = aClass.getMethod("exec", String.class);
  11. Method getRuntimeMethod = aClass.getMethod("getRuntime");
  12. Object runtime = getRuntimeMethod.invoke(aClass);
  13. exec.invoke(runtime, "calc.exe");
  14. Class c1= Class.forName("java.lang.Runtime");
  15. Constructor m = c1.getDeclaredConstructor();
  16. m.setAccessible(true);
  17. c1.getMethod("exec", String.class).invoke(m.newInstance(), "calc");
  18. 2、不安全的反射对象
  19. 指应用程序使用具有反射功能的外部输入来选择要使用的类或代码,
  20. 可能被攻击者利用而输入或选择不正确的类。绕过身份验证或访问控制检查
  21. 参考分析:https://zhuanlan.zhihu.com/p/165273855
  22. 利用结合:https://xz.aliyun.com/t/7031(反序列化利用链)
复制代码
GetRunExec.java
  1. package com.example;
  2. import java.io.IOException;
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. public class GetRunExec {
  7.     public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
  8.         //原生调用 JDK自带的rt.jar
  9. //        Runtime.getRuntime().exec("calc");
  10.         //如果是第三方的jar包
  11.         //通过 Class.forName("java.lang.Runtime") 方法获取了 java.lang.Runtime 类的 Class 对象,并将其赋值给 aClass。
  12.         Class aClass = Class.forName("java.lang.Runtime");
  13.         //获取所有公共包括继承的成员方法
  14.         Method[] methods = aClass.getMethods();
  15.         for(Method me:methods){
  16.             System.out.println(me);
  17.         }
  18.         //获取exec成员方法
  19.         Method exec = aClass.getMethod("exec", String.class);
  20.         //获取getRuntime成员方法
  21.         Method getRuntimeMethod = aClass.getMethod("getRuntime");
  22.         //执行
  23.         Object runtime = getRuntimeMethod.invoke(aClass);
  24.         exec.invoke(runtime, "calc.exe");
  25.     }
  26. }
复制代码
文章参考https://blog.csdn.net/qq_61553520/article/details/136611937?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522baec5cd87d3bc16a3b87a813b077294a%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=baec5cd87d3bc16a3b87a813b077294a&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-136611937-null-null.nonecase&utm_term=34&spm=1018.2226.3001.4450

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表