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、根据类名:类名.class
        Class 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");
    }
}

思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【三】安装k8s+kuboard, 拉取harbor镜像并执行yml文件

自己的配置 我在尊云上两百多买了三台2c4g的服务器,其实买两台就够了。 修改服务网卡掩码 确保几台服务器内网之间可以ping通 以尊云为例,vi /etc/sysconfig/network-scripts/ifcfg-eth1 修NETMASK值为255.0.0.0,重启服务器,尝试…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:NavDestination)

作为子页面的根容器,用于显示Navigation的内容区。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件从API Version 11开始默认支持安全区避让特性(默认值为:expandSaf…

一文了解Cornerstone3D中窗宽窗位的3种设置场景及原理

🔆 引言 在使用Cornerstone3D渲染影像时,有一个常用功能“设置窗宽窗位(windowWidth&windowLevel)”,通过精确调整窗宽窗位,医生能够更清晰地区分各种组织,如区别软组织、骨骼、脑组织等。…

Unity中使用C#以【拟牛顿法】来求解非线性方程组

python科学计算包中有一个fsolve函数来求解非线性方程组,那么C#中用什么包和什么api与之对应呢?本文仅针对拟牛顿法求解过程展开MathNet包中对应API的考察和测试。 一、案例1 1、方程组 2、python的解法 (1)代码 from scipy.o…

大语言模型智能体简介

大语言模型(LLM)智能体,是一种利用大语言模型进行复杂任务执行的应用。这种智能体通过结合大语言模型与关键模块,如规划和记忆,来执行任务。构建这类智能体时,LLM充当着控制中心或“大脑”的角色&#xff0…

【webrtc】m122:BitrateProber 源码阅读与分析

pacing controller 需要 bitrate prober Pacing模块中存在一个BitrateProber prober_的成员变量,专门用来处理带宽探测 大神的分析也是基于最新版本webrtc的:ProbeController每次可能会生成多个探测源数据ProbeClusterConfig,其中每个源数据ProbeClusterConfig对应一个探测簇…

现代DevOps如何改变软件开发格局

在软件开发的早期,该过程通常是开发人员编写代码,再将其交给质量保证(QA)进行测试。这种瀑布开发方法可能会导致质量问题和延迟,因为问题是在周期后期发现的。 一、了解DevOps和测试左移 DevOps是Development和Opera…

深度学习_VGG_3

目标 知道VGG网络结构的特点能够利用VGG完成图像分类 2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络:VGGNet,并取得了ILSVRC2014比赛分类项目…

某聘 zp__stoken__

前言: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018…

Shell正则表达式

目录 正则表达式的分类 基本组成部分 POSIX字符类 元字符 正则表达式的分类 基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs)扩展的正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs&#xf…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PatternLock)

图案密码锁组件,以九宫格图案的方式输入密码,用于密码验证场景。手指在PatternLock组件区域按下时开始进入输入状态,手指离开屏幕时结束输入状态完成密码输入。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容&#…

日期组件报错:Prop being mutated: “placement“

在使用vue2.0开发项目时遇到一个使用日期选择器的报错 报错截图: 对比官网比对没有发现问题,后来查询资料找到了两个解决方案 方案1(推荐): 在日期组件的标签处添加如下属性placement“bottom-start”:…

openssl3.2 - 官方demo学习 - encode - ec_encode.c

文章目录 openssl3.2 - 官方demo学习 - encode - ec_encode.c概述笔记产生ecc私钥产生ecc公钥测试工程备注备注END openssl3.2 - 官方demo学习 - encode - ec_encode.c 概述 官方demos/encode 目录中给了2个例子工程 功能是载入(RSA/ECC)公钥, 然后自己就可以拿内存中的公钥对…

如何保护企业云上安全

近日,CrowdStrike发布了《2024年全球威胁报告》,揭示了网络攻击的最新趋势。报告指出,网络攻击生态系统仍在持续增长,CrowdStrike在2023年观察到了34个新的威胁参与者。同时,攻击者正越来越多地瞄准云环境,…

机器学习,剪刀,石头,布

计算机视觉:剪刀,石头,步 TensorFlow AI人工智能及Machine Learning训练图集的下载建立分类模型并用图像进行训练检验模型总结当前AI Machine Learning 异常火爆,希望在MCU上使用机器学习,做图像识别的工作。看到一个剪刀,石头,步的学习程序,给大家分享一下。 TensorFl…

Centos7 安装mongodb 7.0

官方手册参考: https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-red-hat/ Mongodb支持的版本 安装 MongoDB 社区版 按照以下步骤使用包管理器安装 MongoDB Community Edition yum。 配置包管理系统 ( yum) 创建一个/etc/yum.repos.d/mongodb-o…

【机器学习】科学库使用第1篇:机器学习(常用科学计算库的使用)基础定位、目标【附代码文档】

机器学习(科学计算库)完整教程(附代码资料)主要内容讲述:机器学习(常用科学计算库的使用)基础定位、目标,机器学习概述,1.1 人工智能概述,1.2 人工智能发展历…

使用OpenCV实现两张图像融合在一起

简单介绍 图像融合技术是一种结合多个不同来源或不同传感器捕获的同一场景的图像数据,以生成一幅更全面、更高质量的单一图像的过程。这种技术广泛应用于遥感、医学影像分析、计算机视觉等多个领域。常见的图像融合技术包括基于像素级、特征级和决策级的融合方法&a…

每日OJ题_路径dp⑥_力扣174. 地下城游戏

目录 力扣174. 地下城游戏 解析代码 力扣174. 地下城游戏 174. 地下城游戏 难度 困难 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对…

HTML 学习笔记 总结

总结 【标签按照功能进行分类】&#xff1a; <!DOCTYPE html>&#xff1a;声明为 HTML5 文档 <html>&#xff08;双标记、块标记&#xff09;&#xff1a;是 HTML 页面的根元素&#xff0c;定义 HTML 文档 <head>&#xff08;双标记、块标记&#xff09;&a…