当前位置: 首页 > news >正文

扩展名网站架设一个网站

扩展名网站,架设一个网站,北京南站附近的景点,个体户可以做企业网站前言 还是JAVA安全#xff0c;哎#xff0c;真的讲不完#xff0c;太多啦。 今天主要是讲一下JAVA中的反射机制#xff0c;因为反序列化的利用基本都是要用到这个反射机制#xff0c;还有一些攻击链条的构造#xff0c;也会用到#xff0c;所以就讲一下。 什么是反射…前言 还是JAVA安全哎真的讲不完太多啦。 今天主要是讲一下JAVA中的反射机制因为反序列化的利用基本都是要用到这个反射机制还有一些攻击链条的构造也会用到所以就讲一下。 什么是反射 Java提供了一套反射API该API由Class类与java.lang.reflect类库组成。 该类库包含了Field、Method、Constructor等类。 对成员变量成员方法和构造方法的信息进行的编程操作可以理解为反射机制。 从官方定义中就能找到其存在的价值在运行时获得程序或程序集中每一个类型的成员和成员的信息从而动态的创建、修改、调用、获取其属性而不需要事先知道运行的对象是谁。划重点在运行时而不是编译时。不改变原有代码逻辑自行运行的时候动态创建和编译即可 参考连接文章 - JAVA安全基础二-- 反射机制 - 先知社区 项目创建 创建一个Java项目名字叫ReflectDemo。 我这里选择JAVAEE8。 把这几个东西删除掉因为没啥用。 新建一个类叫User。 先写入以下代码这里说明一下以下四个为成员变量分别对应3个不同的属性公共属性、私有属性、保护属性。 public String name wlw;public int age 20;private String gender man;protected String job sec; 再写入成员方法一个为public属性一个为protected属性。 public void userinfo(String name, int age, String gender, String job) {this.name name;this.age age;this.gender gender;this.job job;} protected void users(String name, String gender) {this.name name;this.gender gender;System.out.println(user的成员方法name);System.out.println(user的成员方法gender);} 最后再写入两个构造方法可以看到方法名字都是User和我们类的名字一样。 public User(){}public User(String name){System.out.println(my namename);}private User(String name,int age){System.out.println(name);System.out.println(age);} Class对象类获取 OK我们的User类已经写好了现在来获取它里面的方法。可能有人有疑惑我都知道这个类名叫User为啥还要获取它呢是这样的你要对一个类进行操作或者调用首先必须要获取这个类的类名才行进行下一步并不是说我们人知道类名就行了还得让代码知道。 根据全限定类名获取 我们直接Class.forName(“全路径类名”)运行起来成功获取类名。 public static void main(String[] args) throws ClassNotFoundException {Class aClass Class.forName(com.sf.maven.reflectdemo.User);System.out.println(aClass);} 根据类名获取 第二种是直接类名.class即可获取到类名 Class bClass User.class; System.out.println(bClass); 根据对象获取 第三种是对象.getClass()直接获取类名。 User user new User(); Class aClass1 user.getClass(); System.out.println(aClass1); 通过类加载器获取 第四种就是我们可以通过类加载器 ClassLoader.getSystemClassLoader().loadClass(“全路径类名”); 来获取类名。 ClassLoader clsloadClassLoader.getSystemClassLoader();Class aClass2 clsload.loadClass(com.sf.maven.reflectdemo.User);System.out.println(aClass2); 利用反射获取成员变量 前面我们已经获取到类名了现在我们利用反射来获取类里面的成员变量。 新建一个类叫GetField在里面写入我们获取成员变量的方法先在开头加入我们获取类名的代码才行。 常见的获取成员变量的方法有以下几种。 获取所有公共成员变量 可以看到输出的是我们在User定义的两个public成员变量name和age。 Field[] fields aClass.getFields(); for (Field field : fields) {System.out.println(field);} 获取所有成员变量 可以看到三个不同属性的成员变量均获取到。 Field[] fields1 aClass.getDeclaredFields(); for (Field field : fields1) {System.out.println(field);} 获取单个公共成员变量 可以看到只获取了一个name公共成员变量。 //获取单个公共成员变量Field field2 aClass.getField(name);System.out.println(field2); 获取任意单个成员变量 可以看到无论是什么属性的成员变量都可以获取到。 //获取单个成员变量Field field3 aClass.getDeclaredField(gender);System.out.println(field3); 成员变量的值修改和获取 看完获取成员变量了我们再看一下对成员变量的值进行修改还有获取。 首先创建一个对象也就是获取类名然后获取age这个公共的成员变量接着获取user对象的age值最后输出。 可能这里大家有点不明白前面开头我们不是已经获取类名了为啥这里还要获取啊。是这样的前面获取的类名我们只是为了获取其里面的age成员变量此时我们的age成员变量已经赋值给field4了field4.get(user)就是获取user类里面的age值换句话说后面的是我们要从这个User类里面得到这个age的值也就是说我们new一个其它的类只要这个类里面有age的成员变量也会被获取讲的有点乱不对还请指正 //获取成员变量的值User user new User();Field field4 aClass.getField(age);Object a field4.get(user);System.out.println(a); 接着对User类里面age的值进行修改通过 field4.set(user,30); 修改user类里面的age值可以看到输出为30但是我们并没有去修改user类age成员变量的代码这就是JAVA反射机制 field4.set(user,30); Object b field4.get(user); System.out.println(b); 利用反射获取构造方法 获取类中的构造方法也是有四种方式。 新建一个类叫GetConstructor用来专门写获取构造方法的代码同样记得再开头加上获取类名的代码才行。 获取所有公共构造方法 可以看到获取到了我们前面写好的User(String name) 和 USer() 这两个公共的成员方法。 //获取公共构造方法Constructor[] constructors1 class1.getConstructors();for (Constructor constructor : constructors1) {System.out.println(constructor);} 获取所有构造方法 可以看到无论是public属性还是private属性的构造方法都被获取到了。 //获取所有构造方法Constructor[] constructors2 class1.getDeclaredConstructors();for (Constructor constructor : constructors2) {System.out.println(constructor);} 获取单个公共构造方法 这个和获取所有的公共构造方法的代码差不多只不过是指定了 String 类型的构造方法前面我们写好的String类型的公共构造方法就只有 User(String name) 所以就返回了这个。 //获取单个公共构造方法Constructor constructor3 class1.getConstructor(String.class);System.out.println(constructor3); 获取单个私有构造方法 和上一个的差不多只不过是多了个Declared而已。 //获取单个私有构造方法 Constructor constructor4 class1.getDeclaredConstructor(String.class, int.class); System.out.println(constructor4); 对构造方法进行操作 setAccessible(true) 临时开启对私有的访问newInstance 使用构造方法创建对象传递参数允许在运行时通过 Constructor 对象调用类的构造方法。 代码逻辑和上面的成员变量修改差不多上面是从User类里面找age这个成员变量这里是从User类里面找到符合的构造方法。可以看到我们的两个参数成功传入到 User(String name,int age) 这个构造方法里面并且成功调用这个构造方法。 //对构造方法进行操作 Constructor constructor5 class1.getDeclaredConstructor(String.class, int.class); //临时开启对私有构造方法的访问 constructor5.setAccessible(true); User uu (User) constructor5.newInstance(wlwnb666,30); System.out.println(uu); 利用反射获取成员方法 获取成员方法的方式也是四种新建一个类叫GetMethod。 获取包括继承的所有公共成员方法可以看到输出有很多公共成员方法这是由于它连JAVA中自带的公共成员方法也一并输出了并不单单输出我们自己写的。 //获取包括继承的所有公共成员方法Method[] methods1 class1.getMethods();for (Method method : methods1) {System.out.println(method);} 获取不包括继承的所有成员方法这里输出了所有我们自己写的成员方法并没有输出JAVA内置的。 //获取不包括继承的所有成员方法Method[] methods2 class1.getDeclaredMethods();for (Method method : methods2) {System.out.println(method);} 获取单个成员方法这个要指定我们获取的成员方法名称为 name 参数类型也要对应上才行。 //获取单个成员方法 Method method3 class1.getDeclaredMethod(users, String.class, String.class); System.out.println(method3); 和上面几乎一样。 //获取单个公共成员方法 Method method4 class1.getMethod(userinfo, String.class, int.class, String.class, String.class); System.out.println(method4); 对成员方法进行调用对我们前面写好的 user 成语方法进行调用。 //调用成员方法 User user new User(); Method method5 class1.getDeclaredMethod(users, String.class, String.class); method5.invoke(user,wlwnb666,sex); 反序列化链条构造 OK反射的知识点基本都讲完了那现在我们来构造以下利用链。 先简单写一个调用计算机的命令执行这个是调用JAVA中自带的包我们称之为原生调用。 但是我们想一想如果是第三方的包是不是就得要用反射机制来得到命令执行由于这里我没有引入第三方的包所以我们就用JAVA自带的包来做一下通过反射实现命令执行的演示当作是外部的包即可。 首先我们可以看到这个Runtime.getRuntime().exec() 这个命令执行方法是来自 java,lang.Runtime这个类的。 那么我们就先获取类名和所有的公共成员方法记得这里要把路径写全不能只写Runtime。 可以看到有很多找到getRuntime这个方法。 查询一下。 现在我们单独把这个getRuntime 获取出来。 此外我们还需获取exec方法由于exec 需要传参String类型所以要加String.class。 Method exec class1.getMethod(exec, String.class); 整个链条如下由于exec方法属于实例方法所以所以 exec. invoke 的第一个参数是 Runtime 实例。 这里可能有人不理解第三第四行代码一开始我也不是很懂后来查了一下大致理解了。首先我们要知道什么是实例对象实例指的是通过某个类Class创建出来的具体对象例如Use user new Use() 这样就创建了一个实例。那么回到我们的代码可以看到 getRuntime 方法返回了 currentRuntime而currentRuntime 正是开头创建的实例也就是说getRuntime 方法返回的是一个实例。 那么回到我们构造的链条Object runtime method4.invoke(class1); 调用 getRuntime 方法并且返回一个实例赋值给 runtime 所以 exec.invoke(runtime, calc.exe); 第一个参数是runtime第二个参数才是命令。 除了上面的说到的链条构造样子还可以这样子去构造不过感觉没有第一种简单明了。 // 使用 Class.forName 获取 Runtime 类 Class c1 Class.forName(java.lang.Runtime);// 获取 Runtime 类的默认构造方法 Constructor m c1.getDeclaredConstructor();// 设置构造方法为可访问 m.setAccessible(true);// 使用反射调用 Runtime 类的 exec 方法执行系统命令 calc c1.getMethod(exec, String.class).invoke(m.newInstance(), calc);不安全的反射对象 指应用程序使用具有反射功能的外部输入来选择要使用的类或代码 可能被攻击者利用而输入或选择不正确的类。绕过身份验证或访问控制检查 参考连接悟空云课堂 | 第七期不安全的反射漏洞 - 知乎 文章 - JAVA反序列化 - Commons-Collections组件 - 先知社区
http://www.hkea.cn/news/14363167/

相关文章:

  • 沈阳专业做网站策划方案范文
  • 驻马店住房和城乡建设局网站能播放优酷视频的网站怎样做
  • 网站开发的外文翻译网络广告发布
  • 环保工程 技术支持 东莞网站建设wordpress需要ftp登录
  • 商务网站开发公司wordpress登录后搜索
  • 俄语在线网站制作google云平台 wordpress
  • 网站开发技术的发展流程网站建设阿里云
  • 网站设计需要需要用吴忠市住房和城乡建设局网站
  • 泗洪建设局网站关键词优化公司兴田德润优惠吗
  • 男男床做视频网站加强局网站建设
  • 如何关闭网站 备案磁力蜘蛛种子搜索
  • 局域网网站生活用品创新设计方案
  • 免费网站模板 百度一下心理咨询网站建设
  • 网站建设策划书模板深圳知名企业
  • 小型手机网站建设电子商务网站开发与实训答案
  • 选择佛山网站设计Sql 发wordpress
  • 软件免费下载的网站大全天河建网站的公司
  • 公司网站推广是做什么北京网首页
  • 少儿美术网站建设方案临平建设局网站
  • 如何做求职招聘网站河南省建设监理协会网站证书查询
  • 哈尔滨高端网站设计六安网站优化
  • 建设电影网站点击播放是乱页的个人网页制作完整教程
  • 自建网站推广方式久久建筑网账号
  • 柯林建站程序寒假网页设计培训珿
  • 燕郊 网站开发怎么做可以把网站图片保存下来吗
  • 备案不关闭网站为自己家秘方做网站
  • 学做土建资料员的网站宣传片制作公司报价
  • 网站设置保存登录密码怎么取消制作会员手机网站
  • 做ptt网站室内设计自学教材
  • 做淘宝客的网站怎么备案网站开发的方案