实例解析Java反射

news2024/11/26 18:17:55

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

什么是反射

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

基本形式

public void execute(String className, String methodName) throws Exception {  
Class clazz = Class.forName(className);  
clazz.getMethod(methodName).invoke(clazz.newInstance());  
}

上面的例子中,我演示了几个在反射里极为重要的方法:获取类的方法: 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;  
}  
}

获取原型类

使用forName方法

Class c = Class.forName("Person");

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

this.getClass().getClassLoader().loadClass("Person");

从原型class里面实例化对象

利用构造函数实例化

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

我们来逐行写一下分析

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看一下返回结果

img

获取类里面的属性

private String name;  
public int age;

public

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

img

private

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

img

获取类方法

Method actmethod = c.getMethod("act",String.class);  
actmethod.invoke(p1,"SKyMirror");

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

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

img

利用URLDNS(反射)

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

利用点

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

源码如下:

img

img

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

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

img

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

img

img

链子

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

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

img

我们跟进一下hash方法

img

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

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

img

同时在正常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);  
​  

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【扫下方二维码】免费领取:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV】车牌自动识别算法的设计与实现

写目录一. &#x1f981; 设计任务说明1.1 主要设计内容1.1.1 设计并实现车牌自动识别算法&#xff0c;基本功能要求1.1.2 参考资料1.1.3 参考界面布局1.2 开发该系统软件环境及使用的技术说明1.3 开发计划二. &#x1f981; 系统设计2.1 功能分析2.1.1 车辆图像获取2.1.2 车牌…

研报精选230303

目录 【个股230303中泰证券_李子园】李子园&#xff1a;甜牛奶行业龙头&#xff0c;全国化加速推进中【行业230303中国银河】医药月报23or02&#xff1a;集采持续推进&#xff0c;控费仍是政策主基调【行业230303国联证券】银行行业专题研究&#xff1a;财富管理月报&#xff1…

征集令!寻找别出心裁的i.MX9352应用方案Demo

想要体验NXP全新的i.MX 9352这颗高性价比处理器吗&#xff1f;想要展示由你亲手打造的超炫酷的应用方案Demo吗&#xff1f;想要领取至高500元的京东E卡奖励吗&#xff1f;现在飞凌嵌入式全都给到你&#xff01;面向全体工程师征集基于飞凌嵌入式OK-MX9352-C开发板设计的优质应用…

【Linux】Shell详解

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

Flutter Button 实例

大家好&#xff0c;我是 17。 在上篇文章 使用 Flutter Button 介绍了如何修改 button 的样式&#xff0c;本文来具体实践一下。 本文列举一些常用的 button 效果&#xff0c;以便在用到的时候方便使用。因为 ElevatedButton 最常用&#xff0c;所以大多以 ElevatedButton 举…

wifi 概率性自动断线(IpReachabilityMonitor)和 案例介绍

IpReachabilityMonitor机制,有时候会遇到用户反馈wifi 会概率性自动断线,最后发现是系统有开启IpReachabilityMonitor 机制,可能是在干扰严重环境下或相对弱信号下让系统误判导致下断线。 这篇博主写的非常好.wifi 概率性自动断线(IpReachabilityMonitor)_lost_provision…

Cesium+Vue3+vite 环境搭建(nvm安装使用),以及简单上手

目录 【nvm的安装和使用】 1、安装nvm 2、配置nvm 3、测试 一、Vite项目 1、创建一个新的Vite项目 解决问题&#xff1a;npm ERR! Unexpected token . 2、安装Cesium插件 3、项目配置 【1】在vite.config.js里进行配置 【2】清空style.css 【3】在App.vue里面进行全…

深度剖析指针(下)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容还是我们的指针呀&#xff0c;上两篇博客我们基本上已经把知识点过了一遍&#xff0c;这篇博客就让小雅兰来带大家看一些和指针有关的题目吧&#xff0c;现在&#xff0c;就让我们进入指针的世界吧 复习&#xff1a; 数组和…

利用Albumentations工具包进行图像的数据增强(以yolo数据标注格式为例)

最近在看数据增强方法时&#xff0c;看到了这个有趣的工具包&#xff0c;研究了下并以yolo数据标注格式为例写了一个示例脚本。 该工具最大的好处是会根据你使用的数据增强方法自动修改标注框信息&#xff01; import albumentations as A import cv2 import os""&…

【摄像头模块】口罩识别功能调试问题总结

文章目录一. 初始化二.程序烧录三.识别是否佩戴口罩小项目中常用到摄像头模块&#xff0c;文章内容疑问&#xff0c;可以私信交流 一. 初始化 1.初始界面为版本号&#xff0c;以及SD卡识别 如果未出现此界面&#xff0c;则可以按板子上的RST键&#xff0c;或者重新刷固件 …

C++动态规划之最长上升子序列

1 子序列与上升子序列1.1 子序列一个序列A{a1,a2,...an}中任意删除若干项&#xff0c;剩余的序列叫做A的一个子序列。例如序列A{1,3,5,4,2}&#xff0c;删除其中的第3项和第5项&#xff0c;得到序列B{1,3,4}&#xff0c;删除其中的第3项和第4项&#xff0c;得到序列C{1&#xf…

详述java的设计模式(三)

1.装饰者模式 装饰者模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装。 使用场景&#xff1a; 在不影响其他对象的情况下&#xff…

使用Python免费试用最新Openai API

一、背景介绍 3月2日凌晨&#xff0c;OpenAI放出了真正的ChatGPT API&#xff0c;不是背后的GPT-3.5大模型&#xff0c;是ChatGPT的本体模型&#xff01;ChatGPT API价格为1k tokens/$0.002&#xff0c;等于每输出100万个单词&#xff0c;价格才2.7美金&#xff08;约18元人民…

数据可视化展示:打工人常见职业病,颈腰椎病占比最高达66.51%

身体健康才是一切的根本。只有身体健健康康才能更好的去享受世间的美好&#xff0c;无论是谁都应当注重身体健康&#xff0c;而不是无度的挥霍它&#xff01; 良好的身体&#xff0c;释放给工作&#xff0c;健壮的体魄&#xff0c;享受美好生活&#xff0c;良好的心态&#xff…

2023年独立站建站平台有哪些?

在当今互联网时代&#xff0c;网站已经成为了人们展示自我、宣传企业、交流信息的重要平台。如果您想要打造自己的网站&#xff0c;但是没有足够的技术和设计经验&#xff0c;那么独立站建站平台可能是一个不错的选择。下面介绍一些常见的独立站建站平台。 WordPress&#xff…

活动回顾(PPT+视频)|全球人工智能开发者先锋大会 Jina AI 的现场直击!

2 月 25 - 26 日&#xff0c;全球人工智能开发者先锋大会&#xff08;GAIDC&#xff09;在上海临港中心成功举办&#xff0c;Jina AI 的高级算法工程师参加「 AI 工程化 MLOps 论坛」为大家带来精彩的主题演讲《多模态 AI 应用开发新范式》&#xff0c;开源集市迎来近 500 位小…

Python机器学习实战(一)

文章目录基于逻辑回归实现乳腺癌预测基于k-近邻算法实现鸢尾花分类基于决策树实现葡萄酒分类基于朴素贝叶斯实现垃圾短信分类基于支持向量机实现葡萄酒分类基于高斯混合模型实现鸢尾花分类基于主成分分析实现鸢尾花数据降维基于奇异值分解实现图片压缩基于逻辑回归实现乳腺癌预…

谷歌seo独立站搜索引擎优化指南【2023新版】

作为一个拥有十年操作经验的个人站长&#xff0c;我认为SEO是网站优化的核心&#xff0c;它可以帮助我们的网站在搜索引擎上获得更高的排名和更多的流量。在本篇文章中&#xff0c;我将分享我的谷歌SEO独立站搜索引擎优化指南&#xff0c;希望对您有所帮助。 一、关键词研究 关…

Invalid <url-pattern> [sso.action] in filter mapping

Tomcat 8.5.86版本启动web项目报错Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [sso.action] in filter mapping 查看项目的web.xml文件相关片段 <filter-mapping><filter-name>SSOFilter</filter-name><url-pattern&g…

Linux I2C 驱动实验

目录 一、Linux I2C 驱动简介 1、I2C 总线驱动 2、I2C 设备驱动 1、 i2c_client 结构体 2、 i2c_driver 结构体 二、硬件分析 三、设备树编写 1、pinctrl_i2c1 2、在 i2c1 节点追加 ap3216c 子节点 3、验证 四、 代码编写 1、makefile 2、ap3216c.h 3、ap3216c.c …