第34天:安全開發-JavaEE應用反射機制攻擊鏈類對象成員變量方法構造方法

時間軸:

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 對象類獲取

Java-反射-Field 成員變量類獲取

Java-反射-Method 成員方法類獲取

Java-反射-Constructor 構造方法類獲取

Java-反射-不安全命令執行&反序列化鏈

#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");

演示:

1.創建ReflectDemo

2.刪除這三個和子目錄

3.創建user:

4.創建成員變量,構造方法,成員方法:

package com.example.reflectdemo;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);}}

獲取類的4種方法:

//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");

注意:獲取全部路徑是復制路徑——復制引用

package com.example.reflectdemo;public class GetClass {public static void main(String[] args) throws ClassNotFoundException {//1、根據全限定類名:Class.forName("全路徑類名")Class aClass = Class.forName("com.example.reflectdemo.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.reflectdemo1.User");System.out.println(aClass2);}
}

運行結果:

Java-反射-Field 成員變量類獲取

利用反射獲取變量圖解

創建GetFiled:

package com.example.reflectdemo;import java.lang.reflect.Field;public class GetFiled {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {Class aClass = Class.forName("com.example.reflectdemo.User");//獲取公共的成員變量
//        Field[] fields = aClass.getFields();
//        for(Field fd:fields){               //將Fields的值依次給到fd
//            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);}
}

第一個獲取公共的成員變量的運行結果:Filed[] getFields():

得到的與User.java中的public下的變量相似

第二個獲取所有的成員變量的運行結果:

第三個? 1.獲取單個的公共成員變量? 2.獲取單個的成員變量

第四個賦值與獲取值:

Java-反射-Constructor 構造方法類獲取

獲取構造方法圖解:

?

創建GetConstructor:

package com.example.reflectdemo;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.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 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-反射-Method 成員方法類獲取

利用反射獲取成員方法圖解:

創建GetMethod:

package com.example.reflectdemo1;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.reflectdemo1.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);//對成員方法進行執行
//        User u = new User();
//        Method users = aClass.getDeclaredMethod("users", String.class,String.class);
//        users.invoke(u,"xiaodigay","gay1");}
}

獲取包括繼承的公共成員方法

以下為繼承的方法

獲取不包括繼承的所有成員方法

獲取單個的成員方法

對成員方法進行執行

Java-反射-不安全命令執行&反序列化鏈‘

對于反序列化基礎就是反射(jdbc(連接數據庫),rmi)

package com.example.reflectdemo;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 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");}
}

1.使用原生調用 JDK自帶的rt.jar

按住runtime可以查看getRuntime()這個函數的出處

2.使用反射機制來啟動計算器

可以使用ctl+F來進行搜索

JAVA反序列化

JAVA反序列化 - Commons-Collections組件 - 先知社區

JAVA反序列化 - 反射機制 - 先知社區

java反序列化驗證工具

本文章由李豆豆喵和番薯小羊卷~共同完成!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65783.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65783.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django后端相應類設計

通用的ApiResponse類:用于生成統一的 API 響應格式。每個響應都包含以下字段(每個接口最終的返回數據格式): status_code:HTTP 狀態碼(如 200、400、500 等)message:響應的描述信息…

汽車基礎軟件AutoSAR自學攻略(三)-AutoSAR CP分層架構(2)

汽車基礎軟件AutoSAR自學攻略(三)-AutoSAR CP分層架構(2) 下面我們繼續來介紹AutoSAR CP分層架構,下面的文字和圖來自AutoSAR官網目前最新的標準R24-11的分層架構手冊。該手冊詳細講解了AutoSAR分層架構的設計,下面讓我們來一起學習一下。 Introductio…

css面試常考布局(圣杯布局、雙飛翼布局、三欄布局、兩欄布局、三角形)

兩欄布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

模糊查詢在sqlserver、dm8、mysql的編寫示例

模糊查詢要求&#xff1a;字段值以 25D 開頭&#xff0c;并以 4 位數字結尾 sqlserver&#xff1a; select * from table_name where column_name like 25D[0-9][0-9][0-9][0-9] 說明&#xff1a; 25D&#xff1a;表示字符串以 25D 開頭。 [0-9][0-9][0-9][0-9]&#xf…

SCTNet模型詳解及代碼復現

模型背景 隨著深度學習技術的發展,語義分割領域取得了顯著進展。然而,在實際應用中,特別是在實時場景下,現有模型往往面臨計算復雜度高、難以平衡精度和速度等問題。為應對這些挑戰,研究人員提出了SCTNet模型,旨在解決實時語義分割問題,同時兼顧精度和效率。該模型融合…

Python的循環

Python的循環 Python的循環有兩種&#xff0c;分別是for…in循環和while循環。 for…in 循環 假設我們要循環輸出一個列表里的元素&#xff1a; names [張三,李四,王五] for name in names:print(name)執行這段代碼后&#xff0c;會依次打印names的每一個元素&#xff1a;…

【0387】Postgres內核 streaming replication(流復制)工作原理

1. Postgres 流復制 本文是關于設置 PostgreSQL 版本流復制的簡明指南,力求盡可能不受平臺限制。故而,其假定您擁有運用操作系統工具編輯文件及安裝/配置軟件包的扎實知識。并且,還假定您熟悉 PostgreSQL 的配置情況。 PostgreSQL 內置的流復制為您的數據庫構建了一個服務…

網絡攻擊行為可視化分析系統【數據分析 + 可視化】

一、系統背景 隨著信息技術的快速發展&#xff0c;網絡已成為現代社會不可或缺的一部分。然而&#xff0c;與此同時&#xff0c;網絡攻擊手段也日益多樣化和復雜化&#xff0c;給企業和個人的信息安全帶來了極大的威脅。傳統的網絡攻擊分析方法往往依賴于人工分析和處理大量的…

利用obs studio制作(人像+屏幕)錄制影像

1.什么是obs? OBS&#xff08;Open Broadcaster Software&#xff09;是一款功能強大的開源軟件&#xff0c;它使用戶能夠直接從電腦錄制視頻和直播內容到 Twitch&#xff0c;YouTube 和 Facebook Live 等平臺。它在需要直播或錄制屏幕活動的游戲玩家、YouTube 用戶和專業人士…

蠕蟲病毒會給服務器造成哪些危害?

蠕蟲病毒是一種獨立的惡意計算機程序&#xff0c;可以進行自我復制來傳播到其他的計算機系統當中&#xff0c;蠕蟲病毒和傳統病毒之間是有著區別的&#xff0c;蠕蟲病毒不需要宿主程序就能夠自行傳播&#xff0c;主要是利用各種操作系統漏洞進行攻擊的。 接下來小編就介紹一下蠕…

C# GDI+的DrawString無法繪制Tab鍵的現象

【啰嗦2句】 現在用C#的人很少了吧&#xff1f;GDI更少了吧&#xff1f;所以這個問題估計也冷門。沒關系&#xff0c;分享給特定需要的人也不錯。 【問題現象】 工作中開發了一個報告編輯器&#xff0c;實現圖文排版等功能&#xff0c;用著沒什么問題&#xff0c;直到有一天…

互斥信號量的等待與通知

目錄 等待互斥信號量 信號量未被占用 信號量被自己占用 信號量被高優先級任務占用 信號量被低優先級任務占用 釋放互斥信號量 未發生優先級繼承 發生優先級繼承 等待互斥信號量 信號量未被占用 標記為已經被占用鎖定計數1 信號量被自己占用 鎖定計數1 信號量被高優先級任務占用…

夯實前端基礎之HTML篇

知識點概覽 HTML部分 1. DOM和BOM有什么區別&#xff1f; DOM&#xff08;Document Object Model&#xff09; 當網頁被加載時&#xff0c;瀏覽器會創建頁面的對象文檔模型&#xff0c;HTML DOM 模型被結構化為對象樹 用途&#xff1a; 主要用于網頁內容的動態修改和交互&…

Qt資源文件以及文件加密

1、Qt資源文件 在Qt中&#xff0c;資源文件&#xff08;.qrc&#xff09;是一種方便的方式來管理應用程序中的多媒體文件&#xff0c;如圖像、圖標和其他資源。這些文件使用XML格式定義&#xff0c;并在編譯時嵌入到應用程序的二進制文件中。 創建資源文件的步驟如下&#xff…

深入詳解人工智能自然語言處理(NLP)之文本處理:分詞、詞性標注、命名實體識別

【自然語言處理】——深入詳解人工智能自然語言處理&#xff08;NLP&#xff09;之文本處理&#xff1a;分詞、詞性標注、命名實體識別 自然語言處理&#xff08;Natural Language Processing&#xff0c;簡稱NLP&#xff09;是人工智能的一個重要分支&#xff0c;涉及如何使計…

SD ComfyUI工作流 老照片修復上色

文章目錄 老照片修復上色SD模型Node節點工作流程開發與應用效果展示老照片修復上色 該工作流專門設計用于老照片的修復和上色,通過一系列高級的圖像處理技術,包括深度圖預處理、面部修復、上色和圖像放大等步驟,來恢復老照片的質量并增加色彩。首先,工作流加載老照片并進行…

后端技術選型 sa-token校驗學習 下 結合項目學習 前后端登錄

目錄 后端設置 Controller 層 Service 層 后端返回 Token 給前端 1. 用戶提交登錄請求 2. 后端驗證用戶身份 3. 返回 Token 4. 前端保存 Token 前端存儲 1. 前端向后端發起請求 2. 前端存儲一下 Token 3.管理用戶認證的 token 的 工具 4. 在 Service 層進行設置 H…

dtdug匯編指令練習

r 通用寄存器 m 代表內存 imm 代表立即數 r8 代表8位通用寄存器 m8 代表8位內存 imm8 代表8位立即數 mov指令練習 MOV 的語法: mov 目標操作數&#xff0c;源操作數 作用:拷貝源操作數到目標操作數 1、源操作數可以是立即數、通用寄存器、段寄存器、或者內存單元. 2、目標操作數…

vue3模板引用ref

1.訪問模板引用 要在組合式 API 中獲取引用&#xff0c;我們可以使用輔助函數 useTemplateRef() 只可以在組件掛載后才能訪問模板引用 <script setup> import { useTemplateRef, onMounted } from vue// 第一個參數必須與模板中的 ref 值匹配 const input useTempla…

如何用 SSH 訪問 QNX 虛擬機

QNX 虛擬機默認是開啟 SSH 服務的&#xff0c;如果要用 SSH 訪問 QNX 虛擬機&#xff0c;就需要知道虛擬機的 IP 地址&#xff0c;用戶和密碼。本文我們來看看如何獲取這些參數。 1. 啟動虛擬機 啟動過程很慢&#xff0c;請耐心等待。 2. 查看 IP 地址 等待 IDE 連接到虛擬機。…