Day34:安全开发-JavaEE应用反射机制攻击链类对象成员变量方法构造方法
目录
Java-反射-Class对象类获取
Java-反射-Field成员变量类获取
Java-反射-Method成员方法类获取
Java-反射-Constructor构造方法类获取
Java-反射-不安全命令执行&反序列化链构造
思维导图
Java知识点
功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,反射机制待补充
安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
安全:原生开发安全,第三方框架安全,第三方库安全等,待补充
Java-反射-基础知识
1、什么是Java反射?
参考:https://xz.aliyun.com/t/9117
Java提供了一套反射API,该API由Class类与java.lang.reflect类库组成。
该类库包含了Field、Method、Constructor等类。
对成员变量,成员方法和构造方法的信息进行的编程操作可以理解为反射机制。2、为什么要用到反射?
参考:https://xz.aliyun.com/t/9117
其实从官方定义中就能找到其存在的价值,在运行时获得程序或程序集中每一个类型的成员和成员的信息,从而动态的创建、修改、调用、获取其属性,而不需要事先知道运行的对象是谁。划重点:在运行时而不是编译时。(不改变原有代码逻辑,自行运行的时候动态创建和编译即可)3、反射机制应用
开发应用场景:
Spring框架的IOC基于反射创建对象和设置依赖属性。
SpringMVC的请求调用对应方法,也是通过反射。
JDBC的Class#forName(String className)方法,也是使用反射。安全应用场景:
构造利用链,触发命令执行
反序列化中的利用链构造
动态获取或执行任意类中的属性或方法
动态代理的底层原理是反射技术
rmi反序列化也涉及到反射操作
Java-反射-Class对象类获取
//1、根据类名:类名.classClass userClass = User.class;
//2、根据对象:对象.getClass()
User user = new User();
Class aClass = user.getClass();
//3、根据全限定类名:Class.forName("全路径类名")
Class aClass1 = Class.forName("com.example.reflectdemo.User");
//4、通过类加载器获得Class对象://ClassLoader.getSystemClassLoader().loadClass("全路径类名");
ClassLoader clsload=ClassLoader.getSystemClassLoader();
Class aClass2 = clsload.loadClass("com.example.reflectdemo.User");
创建一个User类,包含成员变量和成员方法,构造方法,便于获取反射所对应需要
package com.example;public class User {//成员变量public String name="xiaodi";public int age = 31;private String gender="man";protected String job="sec";//构造方法public User(){//System.out.println("无参数");}public User(String name){System.out.println("我的名字"+name);}private User(String name,int age){System.out.println(name);System.out.println(age);}//成员方法public void userinfo(String name,int age,String gender,String job){this.job=job;this.age=age;this.name = name;this.gender=gender;}protected void users(String name,String gender){this.name = name;this.gender=gender;System.out.println("users成员方法:"+name);System.out.println("users成员方法:"+gender);}}
GetClass.java
package com.example;public class GetClass {public static void main(String[] args) throws ClassNotFoundException {//1、根据全限定类名:Class.forName("全路径类名")Class aClass = Class.forName("com.example.User");System.out.println(aClass);//2、根据类名:类名.classClass userClass = User.class;System.out.println(userClass);//3、根据对象:对象.getClass()User user= new User();Class aClass1 = user.getClass();System.out.println(aClass1);//4、通过类加载器获得Class对象://ClassLoader.getSystemClassLoader().loadClass("全路径类名");ClassLoader clsload=ClassLoader.getSystemClassLoader();Class aClass2 = clsload.loadClass("com.example.User");System.out.println(aClass2);}
}
Java-反射-Field成员变量类获取
//Class aClass = Class.forName("com.example.reflectdemo.User");//获取公共成员变量对象
// Field[] fields=aClass.getFields();
// for(Field f:fields){
// System.out.println(f);
// }
//获取所有成员变量对象
// Field[] fields=aClass.getDeclaredFields();
// for(Field f:fields){
// System.out.println(f);
// }
//获取公共,私有单个成员变量对象
// Field field=aClass.getField("age");
// Field field=aClass.getDeclaredField("gender");
// System.out.println(field);
//城边变量值获取和赋值
// User u = new User();
// Field field=aClass.getField("age");
// field.set(u,30);
// Object a=field.get(u);
// System.out.println(a);
GetField.java
package com.example;import java.lang.reflect.Field;public class GetField {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Class aClass = Class.forName("com.example.User");//获取公共的成员变量
// Field[] fields = aClass.getFields();
// for(Field fd:fields){
// System.out.println(fd);
// }//获取所有的成员变量
// Field[] fields = aClass.getDeclaredFields();
// for(Field fd:fields){
// System.out.println(fd);
// }//获取单个的公共成员变量Field name = aClass.getField("name");System.out.println(name);//获取单个的成员变量Field gender = aClass.getDeclaredField("gender");System.out.println(gender);//获取公共的成员变量age的值User u = new User();Field field=aClass.getField("age");//取值Object a=field.get(u);System.out.println(a);//赋值field.set(u,32);Object aa=field.get(u);System.out.println(aa);}
}
Java-反射-Method成员方法类获取
//Class aClass = Class.forName("com.example.reflectdemo.User");
//返回所有公共成员方法对象的数组,包括继承的// Method[] methods = aClass.getMethods();
// for (Method me:methods){
// System.out.println(me);
// }
//返回所有成员方法对象的数组,不包括继承的
// Method[] methods = aClass.getDeclaredMethods();
// for (Method me:methods){
// System.out.println(me);
// }
//返回单个公共成员方法对象
// Method methods = aClass.getMethod("getName");
// System.out.println(methods);
// Method methods = aClass.getMethod("setName", String.class);
// System.out.println(methods);
//返回单个成员方法对象
// Method methods = aClass.getDeclaredMethod("UserInfo", String.class, int.class, String.class);
// System.out.println(methods);
//运行方法invoke
// Method methods = aClass.getDeclaredMethod("UserInfo", String.class, int.class, String.class);
// User u = new User();
// //私有需要开启临时
// methods.setAccessible(true);
// methods.invoke(u,"xiaodi",18,"man");
GetMethod.java
package com.example;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class GetMethod {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {Class aClass = Class.forName("com.example.User");//获取包括继承的公共成员方法
// Method[] methods = aClass.getMethods();
// for(Method me:methods){
// System.out.println(me);
// }//获取不包括继承的所有成员方法
// Method[] methods = aClass.getDeclaredMethods();
// for(Method me:methods){
// System.out.println(me);
// }//获取单个的成员方法
// Method users = aClass.getDeclaredMethod("users", String.class,String.class);
// System.out.println(users);// 对成员方法进行执行// invoke() 方法用于调用指定对象的方法,并传递相应的参数。User u = new User();Method users = aClass.getDeclaredMethod("users", String.class,String.class);users.invoke(u,"xiaodigay","gay1");}
}
Java-反射-Constructor构造方法类获取
//Class aClass = Class.forName("com.example.reflectdemo.User");//返回所有公共构造方法对象的数组
// Constructor[] constructors = aClass.getConstructors();
// for(Constructor con:constructors){
// System.out.println(con);
// }
//返回所有构造方法对象的数组
// Constructor[] constructors = aClass.getDeclaredConstructors();
// for(Constructor con:constructors){
// System.out.println(con);
// }
//返回单个公共构造方法对象
// Constructor con1=aClass.getConstructor();
// Constructor con1=aClass.getConstructor(String.class);
// System.out.println(con1);
//返回单个构造方法对象
// Constructor con2=aClass.getDeclaredConstructor(int.class);
//Constructor con2=aClass.getDeclaredConstructor(String.class,int.class, String.class);
// System.out.println(con2);
// Constructor con2=aClass.getDeclaredConstructor(int.class);
// con2.setAccessible(true);
// User uu=(User) con2.newInstance("xiaodi",30,"man");
// System.out.println(uu);
package com.example;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class GetConstructor {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class aClass = Class.forName("com.example.User");//获取公共的构造方法
// Constructor[] constructors = aClass.getConstructors();
// for (Constructor con:constructors){
// System.out.println(con);
// }//获取所有的构造方法
// Constructor[] constructors = aClass.getDeclaredConstructors();
// for (Constructor con:constructors){
// System.out.println(con);
// }//获取单个的公共的构造方法
// Constructor constructor = aClass.getConstructor(String.class);
// System.out.println(constructor);
//
// //获取单个的构造方法
// Constructor con1 = aClass.getDeclaredConstructor(String.class,int.class);
// System.out.println(con1);//对构造方法进行操作(两个参数string,int)
// Constructor con2=aClass.getDeclaredConstructor(String.class,int.class);
// //临时开启对私有的访问
// con2.setAccessible(true);
// User uu=(User) con2.newInstance("xiaodigaygay",40);
// System.out.println(uu);//对构造方法进行执行(1个参数strin)Constructor con2=aClass.getConstructor(String.class);con2.newInstance("xiaodigaygay");}
}
Java-反射-不安全命令执行&反序列化链构造
1 、反射实现 - 命令执行-原型:
Runtime.getRuntime().exec("calc");
-反射:
Class aClass = Class.forName("java.lang.Runtime");
Method[] methods = aClass.getMethods();
for (Method me:methods){
System.out.println(me);
}
Method exec = aClass.getMethod("exec", String.class);
Method getRuntimeMethod = aClass.getMethod("getRuntime");
Object runtime = getRuntimeMethod.invoke(aClass);
exec.invoke(runtime, "calc.exe");
Class c1= Class.forName("java.lang.Runtime");
Constructor m = c1.getDeclaredConstructor();
m.setAccessible(true);
c1.getMethod("exec", String.class).invoke(m.newInstance(), "calc");
2、不安全的反射对象
指应用程序使用具有反射功能的外部输入来选择要使用的类或代码,
可能被攻击者利用而输入或选择不正确的类。绕过身份验证或访问控制检查
参考分析:https://zhuanlan.zhihu.com/p/165273855
利用结合:https://xz.aliyun.com/t/7031(反序列化利用链)
GetRunExec.java
package com.example;import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class GetRunExec {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//原生调用 JDK自带的rt.jar
// Runtime.getRuntime().exec("calc");//如果是第三方的jar包//通过 Class.forName("java.lang.Runtime") 方法获取了 java.lang.Runtime 类的 Class 对象,并将其赋值给 aClass。Class aClass = Class.forName("java.lang.Runtime");//获取所有公共包括继承的成员方法Method[] methods = aClass.getMethods();for(Method me:methods){System.out.println(me);}//获取exec成员方法Method exec = aClass.getMethod("exec", String.class);//获取getRuntime成员方法Method getRuntimeMethod = aClass.getMethod("getRuntime");//执行Object runtime = getRuntimeMethod.invoke(aClass);exec.invoke(runtime, "calc.exe");}
}
思维导图
相关文章:

Day34:安全开发-JavaEE应用反射机制攻击链类对象成员变量方法构造方法
目录 Java-反射-Class对象类获取 Java-反射-Field成员变量类获取 Java-反射-Method成员方法类获取 Java-反射-Constructor构造方法类获取 Java-反射-不安全命令执行&反序列化链构造 思维导图 Java知识点 功能:数据库操作,文件操作,…...

Transformer代码从零解读【Pytorch官方版本】
文章目录 1、Transformer大致有3大应用2、Transformer的整体结构图3、如何处理batch-size句子长度不一致问题4、MultiHeadAttention(多头注意力机制)5、前馈神经网络6、Encoder中的输入masked7、完整代码补充知识: 1、Transformer大致有3大应…...
安卓性能优化面试题 31-35
31. 简述Handler导致的内存泄露的原因以及如何解决 ?在Android开发中,Handler对象可能导致内存泄漏的主要原因是由于Handler持有对外部类对象的隐式引用,从而导致外部类无法被垃圾回收,进而引发内存泄漏。下面是导致Handler内存泄漏的几种常见情况及相应的解决方法: 1. 长…...
QML与C++通信
一、QML中如何使用C的类和对象 前提条件: 1.从 QObject 或 QObject 的派生类继承 2.使用 Q_OBJECT 宏 这两个条件是为了让一个类能够进入 Qt 强大的元对象系统(meta-object system)中,只有使用元对象系统,一个类的某些…...

Explain详解与索引优化最佳实践
Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在select语句之前增加explain关键字,MySQL会在查询前设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL 注意: 如果from中包含子查询,仍会执行该子查询,将结果…...

Spring Boot轻松整合Minio实现文件上传下载功能【建议收藏】
一、Linux 安装Minio 安装 在/root/xxkfz/soft目录下面创建文件minio文件夹,进入minio文件夹,并创建data目录; [rootxxkfz soft]# mkdir minio [rootxxkfz soft]# cd minio [rootxxkfz minio]# mkdir data执行如下命令进行下载 [rootxxkf…...

MySql入门教程--MySQL数据库基础操作
꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Slider)
滑动条组件,通常用于快速调节设置值,如音量调节、亮度调节等应用场景。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Slider(options?: SliderOption…...

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探
宋江等人学会了钩镰枪,大胜呼延灼。呼延灼损失了很多人马,不敢回京,一个人去青州找慕容知府。一天在路上住店,马被桃花山的人偷走了,于是到了青州,带领官兵去打莲花山。 莲花山的周通打不过呼延灼…...
springboot/ssm企业内部人员绩效量化管理系统Java员工绩效管理系统web
springboot/ssm企业内部人员绩效量化管理系统Java员工绩效管理系统web 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&…...
XML语言的学习记录2-XMLHttpRequest
学习笔记:XMLHttpRequest 特点: 在不重新加载页面的情况下更新网页在页面已加载后从服务器请求数据在页面已加载后从服务器接收数据在后台向服务器发送数据创建XMLHttpRequest对象 xmlhttpnew XMLHttpRequest();IE5 和 IE6,使用 …...
力扣爆刷第95天之hot100五连刷61-65
力扣爆刷第95天之hot100五连刷61-65 文章目录 力扣爆刷第95天之hot100五连刷61-65一、131. 分割回文串二、51. N 皇后三、35. 搜索插入位置四、74. 搜索二维矩阵五、34. 在排序数组中查找元素的第一个和最后一个位置 一、131. 分割回文串 题目链接:https://leetcod…...
聊聊powerjob的执行机器地址
序 本文主要研究一下powerjob的执行机器地址(designatedWorkers) SaveJobInfoRequest powerjob-common/src/main/java/tech/powerjob/common/request/http/SaveJobInfoRequest.java Data public class SaveJobInfoRequest {/*** id of the job. set null to create or non-…...

Android Kotlin知识汇总(三)Kotlin 协程
Kotlin的重要优势及特点之——结构化并发 Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。本主题介绍如何使用 Kotlin 协程解决以下问题,从而让您能够编写出更清晰、更简洁的应用代…...

JVM垃圾收集器-serial.parNew,parallelScavnge,serialOld,parallelOld,CMS,G1
垃圾收集器 分代模型 适用于新生代: serial parNew parallel Scaavenge 适用于老年代: CMS serial Old(msc) paraller Old 分区模型 适用于超大容量: G1 分代模型 serial /serial Old收集器 1.单线程收集器 2.收集时会暂停其他线程&…...
docker搭建upload-labs
Upload-labs 是一个专门设计用于学习和练习文件上传安全的开源工具。它提供了各种场景的文件上传漏洞,供用户通过实践来学习如何发现和利用这些漏洞,同时也能学习到防御措施。使用 Docker 来搭建 upload-labs 环境是一种快速、简便的方法,它可…...
超详细外贸单证汇总!
今天给大家汇总了外贸单证的种类与使用相关知识,东西齐全,赶紧码住! 1、合同 CONTRACT是统称,买卖双方均可出具。如系卖方制作,可称为销售确认书,买方出具则可称为采购。 买卖双方均可出具合同。卖方出具的,可称为销售确认书(Sales Confir…...

Docker部署ChatGLM3、One API、FastGPT
创建并运行chatglm3容器 docker run --name chatglm3 -p 8000:8000 registry.cn-hangzhou.aliyuncs.com/ryyan/chatglm.cpp:chatglm3-q5_1 创建并运行one-api容器 (其中挂载路径 D:\one-api 可以选择你自己喜欢的目录) docker run --name oneapi -d -p 3000:3000 -e TZAsia…...

【Linux-网络编程】
Linux-网络编程 ■ 网络结构■ C/S结构■ B/S结构 ■ 网络模型■ OSI七层模型■ TCP/IP四层模型 ■ TCP■ TCP通信流程■ TCP三次握手■ TCP四次挥手 ■ 套接字:socket 主机IP 主机上的进程(端口号)■ TCP传输文件 ■ 网络结构 ■ C/S结构…...

win10虚拟机安装驱动教程
在虚拟机菜单栏中选择安装VMware Tools: 安装好后,在虚拟机中打开此电脑,双击DVD驱动器进行安装: 一直点击下一步: 安装完成: 此时重启虚拟机,发面小屏幕页面的虚拟机自动占满了全部屏幕&#x…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...