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、根据类名:类名.class

Class 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");}
}

思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop伪分布式配置--没有DataNode或NameNode

一、原因分析 重复格式化NameNode 二、解决方法 1、输入格式化NameNode命令,找到data和name存放位置 ./bin/hdfs namenode -format 2、删除data或name(没有哪个删哪个) sudo rm -rf data 3、重新格式化NameNode 4、重新启动即可。

Linux搭建我的世界(MC)整合包服务器,All the Mods 9(ATM9)整合包开服教程

Linux使用MCSM面板搭建我的世界(Minecraft)整合包服务器,MC开服教程,All the Mods 9(ATM9)整合包搭建服务器的教程。 本教程使用Docker来运行mc服,可以方便切换不同Java版本,方便安装多个mc服版本。 视频教程:https:…

MySQL 数据库 下载地址 国内阿里云站点

mysql安装包下载_开源镜像站-阿里云 以 MySQL 5.7 为例 mysql-MySQL-5.7安装包下载_开源镜像站-阿里云

2024年AI辅助研发:技术革新引领研发新纪元

文章目录 📑前言一、AI辅助研发的技术进展二、行业应用案例三、面临的挑战与机遇四、未来趋势预测全篇总结 📑前言 随着科技的飞速发展,人工智能(AI)已逐渐成为推动社会进步的重要力量。特别是在研发领域,A…

AIGC: 2 语音转换新纪元-Whisper技术在全球客服领域的创新运用

背景 现实世界,人跟人的沟通相当一部分是语音沟通,比如打电话,聊天中发送语音消息。 而在程序的世界,大部分以处理字符串为主。 所以,把语音转换成文字就成为了编程世界非常普遍的需求。 Whisper 是由 OpenAI 开发…

【Java基础】IO流(二)字符集知识

目录 字符集知识 1、GBK字符集 2、Unicode字符集(万国码) 3、乱码 4、Java中编码和解码的方法 字符集知识 字符(Character):在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信…

手写Mybatis自动填充插件

目录 一、Mybatis插件简介🥙二、工程创建及前期准备工作🥫实现代码配置文件 三、插件核心代码实现🍗四、测试🥓 一、Mybatis插件简介🥙 Mybatis插件运行原理及自定义插件_简述mybatis的插件运行原理,以及如何编写一个…

macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载

macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载 3 月 8 日凌晨,macOS Sonoma 14.4 发布,同时带来了 macOS Ventru 13.6.5 和 macOS Monterey 12.7.4 安全更新。 macOS Ventura 13.6 及更新版本,如无特殊说明皆为安全更新&…

springboot学习(八十六) springboot使用graalvm编译native程序

一、windows环境下 1.下载graalvm的jdk https://injdk.cn/ 下载windows版本 配置java环境变量,配置过程略 2.下载visual Studio Build Tools 下载地址:https://aka.ms/vs/17/release/vs_BuildTools.exe 安装后选择组件: 其中windows S…

ChatGPT-Next-Web SSRF漏洞+XSS漏洞复现(CVE-2023-49785)

0x01 产品简介 ChatGPT-Next-Web 是一种基于 OpenAI 的 GPT-3.5 、GPT-4.0语言模型的产品。它是设计用于 Web 环境中的聊天机器人,旨在为用户提供自然语言交互和智能对话的能力。 0x02 漏洞概述 2024年3月,互联网上披露CVE-2023-49785 ChatGPT-Next-Web SSRF/XSS 漏洞,未经…

信号与系统学习笔记——信号的分类

目录 一、确定与随机 二、连续与离散 三、周期与非周期 判断是否为周期函数 离散信号的周期 结论 四、能量与功率 定义 结论 五、因果与反因果 六、阶跃函数 定义 性质 七、冲激函数 定义 重要关系 作用 一、确定与随机 确定信号:可以确定时间函数…

Arcgis新建位置分配求解最佳商店位置

背景 借用Arcgis帮助文档中的说明:在本练习中,您将为连锁零售店选择可以获得最大业务量的商店位置。主要目标是要将商店定位在人口集中地区附近,因为这种区域对商店的需求量较大。设立这一目标的前提是假设人们往往更多光顾附近的商店,而对于距离较远的商店则较少光顾。您…

【Redis】Redis常用命令之Hash

1.hset:设置hash中指定的字段(field)的值(value)。 HSET key field value [field value ...]时间复杂度:插⼊⼀组field为O(1),插⼊N组field为O(N)。 返回值:添加的字段的个数。 2.hget&#xf…

MySQL删除数据 文件大小不变的原因以及处理空洞问题

数据删除流程 InnoDB 里的数据都是用 B 树的结构组织的。 假设,我们要删掉 R4 这个记录,InnoDB 引擎只会把 R4 这个记录标记为删除。如果之后要再插入一个 ID 在 300 和 600 之间的记录时,可能会复用这个位置。但是,磁盘文件的大…

Elastic Agent 的安装及使用

概述 Elastic Agent是Elastic Stack中的一个全新组件,旨在简化和统一监控和集成管理流程。它是一个轻量级的代理,可以部署到各种不同类型的主机和容器中,用于收集系统指标、日志和事件数据,并将其发送到Elasticsearch进行存储和分…

Python网络基础爬虫-python基本语法

文章目录 逻辑语句if,else,elifforwhile异常处理 函数与类defpassclass 逻辑语句 熟悉C/C语言的人们可能很希望Python提供switch语句,但Python中并没有这个关键词,也没有这个语句结构。但是可以通过if-elif-elif-…这样的结构代替,或者使用字…

挑战OpenAI的新模型免费上线,40%计算量性能逼近GPT-4

据介绍,Inflection-2.5 将强大的 LLM 能力与 Inflection 标志性的「同理心微调」结合在一起,兼具高情商与高智商,可联网获取事实信息,其性能可与 GPT-4、Gemini 等领先大模型相媲美。 本周四,美国 AI 创业公司 Inflection AI 正式发布新一代大语言模型 Inflection-2.5。 …

福派斯猫粮的适口性有何特点?

亲爱的朋友们,今天我想和大家分享一下福派斯猫粮的适口性特点。作为一位养猫多年的铲屎官,我深知猫粮的适口性对于猫咪的健康和幸福是多么重要。那么,福派斯猫粮在这方面究竟有何独到之处呢? 1️⃣ 首先,福派斯猫粮的口…

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测 目录 分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GSWOA-KELM分类&#xff0…

sqllab第十九关通关笔记

知识点: 错误注入 最大长度为32位;如果目标长度>32时,需要利用截取函数进行分段读取referer注入 insert语句update语句 通过admin admin进行登录发现页面打印除了referer字段的信息 这应该是一个referer注入 首先进行测试一下 构造payl…