【Java安全】RMI基礎

文章目錄

    • 介紹
    • 實現
      • 服務端 Server
      • 客戶端 Client
    • 通信過程
      • 數據端與注冊中心(1099 端口)建立通訊
      • 客戶端與服務端建立 TCP 通訊
      • 客戶端序列化傳輸 調用函數的輸入參數至服務端
      • 總結

介紹

RMI 全稱 Remote Method Invocation(遠程方法調用),即在一個 JVM 中 Java 程序調用在另一個遠程 JVM 中運行的 Java 程序,這個遠程 JVM 既可以在同一臺實體機上,也可以在不同的實體機上,兩者之間通過網絡進行通信。

RMI的一般要用到的組件:

  • Remote Interface:遠程接口

需要定義一個接口,繼承自 java.rmi.Remote,表明可以被遠程對象調用的方法。
遠程調用可能發生網絡異常 , 所以每個方法都必須顯式拋出 RemoteException

  • Remote Object Implementation:遠程接口的具體實現

一般需要繼承UnicastRemoteObject類, 將對象導出成一個 可以通過 TCP 調用的遠程對象

  • Server:服務端,注冊遠程對象到 RMI 注冊中心。
  • Client:客戶端,查找遠程對象并調用其方法。
  • Registry:注冊端提供服務注冊與服務獲取。即 Server 端向 Registry 注冊服務,比如地址、端口等一些信息,Client 端從 Registry 獲取遠程對象的一些信息,如地址、端口等,然后進行遠程調用。

實現

服務端 Server

定義遠程接口

package RMI.Server;import java.rmi.Remote;
import java.rmi.RemoteException;public interface Hello extends Remote {public String sayHello(String name) throws RemoteException;
}

遠程接口的實現

package RMI.Server;import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;public class HelloImpl extends UnicastRemoteObject implements Hello {public HelloImpl() throws RemoteException {super(); //也可以什么都不寫,隱式調用//如果沒有繼承UnicastRemoteObject,就需要手動導出: UnicastRemoteObject.exportObject(this, 0); }@Overridepublic String sayHello(String name) throws RemoteException {return "Hello " + name;}
}

服務端

主要是創建 RMI 注冊表(使用默認端口 1099),創建服務實現類的實例,將遠程對象綁定到注冊表中

package RMI.Server;import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;public class RMIServer {public static void main(String[] args) {try{//實例化遠程對象HelloImpl obj = new HelloImpl();//啟動本地的RMI注冊服務(一般默認 1099 端口),創建注冊中心LocateRegistry.createRegistry(1099);Registry registry = LocateRegistry.getRegistry();//綁定遠程對象registry.bind("HelloImpl", obj);//或者import java.rmi.Naming;//Naming.bind("rmi://127.0.0.1:1099/HelloImpl", obj);}catch (Exception e){e.printStackTrace();}}
}

客戶端 Client

連接到本地(localhost)的 RMI 注冊表然后查找相應名字的遠程對象,最后調用遠程方法,傳入相應參數

package RMI.Client;import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import RMI.Server.Hello; // 導入服務器端的遠程接口public class RMIClient {public static void main(String[] args) throws Exception {//連接到服務器Registry registry = LocateRegistry.getRegistry("localhost", 1099);//通過名字查找遠程對象Hello hello = (Hello) registry.lookup("HelloImpl");//調用遠程對象上面的方法String response = hello.sayHello("xpw");System.out.println("response :"+response);}}

先運行服務端, 再運行客戶端, 在客戶端就可以看到調用了遠程對象的方法了

在這里插入圖片描述

通信過程

很多復制粘貼的來自其他師傅的博客,了解了一下內部通信的知識,還沒有動手去嘗試抓包

數據端與注冊中心(1099 端口)建立通訊

  • 客戶端查詢需要調用的函數的遠程引用,注冊中心返回遠程引用和提供該服務的服務端 IP 與端口。

在這里插入圖片描述

客戶端與注冊中心(1099 端口)建立通訊完成后,客戶端 向注冊中心發送了?個 “Call” 消息,注冊中心回復了?個 “ReturnData” 消息,然后客戶端新建了?個 TCP 連接,連到服務端的 33769 端?

在這里插入圖片描述

AC ED 00 05是常見的 Java 反序列化 16 進制特征
注意以上兩個關鍵步驟都是使用序列化語句

客戶端與服務端建立 TCP 通訊

客戶端發送遠程引用給服務端,服務端返回函數唯一標識符,來確認可以被調用

在這里插入圖片描述

同樣使用序列化的傳輸形式

以上兩個過程對應的代碼是這兩句

Registry registry = LocateRegistry.getRegistry("127.0.0.1", 1099);  
RemoteObj remoteObj = (RemoteObj) registry.lookup("remoteObj"); // 查找遠程對象

這里會返回一個 Proxy 類型函數,這個 Proxy 類型函數會在我們后續的攻擊中用到。

客戶端序列化傳輸 調用函數的輸入參數至服務端

  • 這一步的同時:服務端返回序列化的執行結果至客戶端

在這里插入圖片描述

以上調用通訊過程對應的代碼是這一句

remoteObj.sayHello("hello");

可以看出所有的數據流都是使用序列化傳輸的,那必然在客戶端和服務帶都存在反序列化的語句。

總結

整個過程進?了兩次TCP握?,也就是我們實際建?了兩次 TCP連接。

第?次建?TCP連接是連接遠端 ip 的1099端?,這也是我們在代碼?看到的端?,? 者進?溝通后,我向遠端發送了?個“Call”消息,遠端回復了?個“ReturnData”消息,然后我新建了? 個TCP連接,連到遠端的33769端?。

之所以是33769端口, 因為在“ReturnData”這個包中,返回了?標的IP地址,其后跟的?個字節 \x00\x00\x83\xE9 ,剛好就是整數 33769 的網絡序列

所以捋一下整個的過程: 首先客戶端連接Registry,并在其中尋找Name是HelloImpl的對象,這個對應數據流中的Call消息;然后Registry返回?個序列化的數據,這個就是找到的Name=HelloImpl的對象,這個對應數據流中的ReturnData消息;客戶端反序列化該對象,發現該對象是?個遠程對象,地址在 127.0.0.1:33769 ,于是再與這個地址建?TCP連接;在這個新的連接中,才執?真正遠程 ?法調?,也就是 HelloImpl()

各個元素之間的關系

在這里插入圖片描述

RMI Registry就像?個?關,他??是不會執?遠程?法的,但RMI Server可以在上?注冊?個Name 到對象的綁定關系;RMI Client通過Name向RMI Registry查詢,得到這個綁定關系,然后再連接RMI Server;最后,遠程?法實際上在RMI Server上調?。

參考文章

代碼審計社區 Java安全漫談
https://drun1baby.top/2022/07/19/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B9%8BRMI%E4%B8%93%E9%A2%9801-RMI%E5%9F%BA%E7%A1%80/#Java-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B9%8B-RMI-%E4%B8%93%E9%A2%98-01-RMI-%E5%9F%BA%E7%A1%80
https://fushuling.com/index.php/2023/01/30/java%e5%ae%89%e5%85%a8%e7%ac%94%e8%ae%b0/

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

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

相關文章

MySQL索引面試問題梳理

本文系統剖析MySQL索引的核心機制: ?索引分類全景圖?:詳解聚簇/非聚簇索引的邏輯差異與物理存儲特點?B樹的統治性優勢?:通過對比Hash/B樹揭示InnoDB的底層選擇邏輯 一、索引分類的常見困惑解析 1. 按物理存儲分類 類型 存儲內容 數量限…

SSH密鑰 與 Ed25519密鑰 是什么關系

SSH 密鑰與 Ed25519 密鑰的關系可以從技術實現和應用場景兩個角度理解。簡而言之:Ed25519 密鑰是 SSH 密鑰的一種類型,用于在 SSH 協議中實現安全認證。以下是詳細解釋: 1. SSH 密鑰的通用概念 SSH(Secure Shell)是一…

【PyTorch 當前版本不支持 NVIDIA GeForce RTX 5060 Ti處理辦法】

報錯信息 X:\Stable-Diffusion-WebUI\system\python\lib\site-packages\torch\cuda\__init__.py:215: UserWarning: NVIDIA GeForce RTX 5060 Ti with CUDA capability sm_120 is not compatible with the current PyTorch installation. The current PyTorch install supports…

Docker部署PaddleX實現PaddleOcr

Docker部署PaddleX實現PaddleOcr 一、版本說明二、安裝PaddleX三、基礎服務化部署四、接口調用實現表格識別五、調參優化一、版本說明 PaddleX 3.0Ubuntu20.04.1Docker version 26.1.3, build 26.1.3-0ubuntu1~20.04.1二、安裝PaddleX 查看服務器信息 docker安裝PaddleX 根據 …

深入學習c++之---AVL樹

VL樹簡介? AVL樹是一種自平衡二叉搜索樹,通過平衡因子(Balance Factor, BF)?和旋轉操作,確保樹始終保持平衡,避免退化成鏈表,從而保證查找、插入、刪除的時間復雜度穩定在 ?O(log n)?。 ?核心特點?…

【PTA數據結構 | C語言版】輸出 1 ~ n

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 給定正整數 n,輸出 1 ~ n,每個數字占一行。 本題旨在測試不同的算法在各種數據情況下的表現。各組測試數據特點如下: 數據 0:測試基本正確性&#x…

如何禁止用戶復制頁面內容?

某些特定的業務場景下,我們可能會有禁止用戶復制頁面內容的需求。比如: 付費內容保護:在線小說、付費課程等,希望防止內容被輕易拷貝和傳播。試卷或答題系統:防止考生將題目復制出去尋求場外幫助。敏感信息展示&#x…

React + PDF.js 預覽 PDF 文件:從基礎實現到高級優化的完整指南

關鍵點 PDF.js:Mozilla 開發的開源 JavaScript 庫,用于在瀏覽器中渲染 PDF 文件。React 集成:結合 React 組件化特性,實現高效、交互式的 PDF 預覽功能。功能實現:支持 PDF 文件加載、頁面導航、縮放、搜索、書簽和注…

新能源汽車BMS電感產品應用及選型推薦

在新能源電動汽車中,BMS(電池管理系統)如同一個守護者,默默守護電池的安全與性能。它精準監控電壓、電流、溫度,防止過充過放,并通過智能均衡技術提升續航能力。電感在BMS系統的電源轉換、濾波和隔離通信等…

【機器學習筆記 Ⅱ】12隨機森林

隨機森林(Random Forest)詳解 隨機森林是一種基于集成學習(Ensemble Learning)的高性能分類/回歸算法,通過構建多棵決策樹并綜合其預測結果,顯著提升模型的準確性和魯棒性。其核心思想是“集體智慧優于個體…

問題 1:MyBatis-plus-3.5.9 的分頁功能修復

問題 1:MyBatis-plus-3.5.9 的分頁功能修復 使用 Sw?agger 接口文檔?依次對上述接口進行測 試,發現 listU?serVOByPage 接口有一些問題! 分頁好像沒有生效,還是查出了全部數據: 由于我們用的是 MyBatis Plus 來操…

Qt 如何提供在線幫助

Qt 如何提供在線幫助一、概述二、工具提示、狀態提示和"Whats This?"幫助1、工具提示(Tool Tips)添加工具提示到控件富文本工具提示全局工具提示設置延遲顯示控制自定義工具提示窗口禁用工具提示工具提示與狀態欄聯動特點:2、狀態提示(Status Tips)3、&q…

Typecho站點關閉插件開發全指南:從原理到實現

文章目錄 開發Typecho站點關閉插件:從原理到實現一、背景與需求分析二、插件設計思路2.1 技術選型2.2 功能模塊設計三、插件開發實現3.1 插件基礎結構3.2 插件主文件實現3.3 核心功能實現3.4 后臺管理界面3.5 關閉頁面模板四、插件配置完善4.1 配置表單實現4.2 定時任務處理五…

詳細解析 .NET 依賴注入的三種生命周期模式

文章目錄一、Transient(瞬時生命周期)原理使用方式核心特性適用場景優勢劣勢二、Scoped(作用域生命周期)原理使用方式核心特性適用場景優勢劣勢三、Singleton(單例生命周期)原理使用方式核心特性適用場景優…

軟件工程經濟與倫理

前言 各位帥哥美女,能看到這篇博客的都有口福了,學習這門課程就像遨游在大份的海洋,一不小心就吃上一口。能看到這篇博客說明我們是有緣人可以點贊收藏一下,這篇博客可以在你無比饑餓的時候給你送上一坨!(香…

AI 體驗走查 - 火山引擎存儲的 AI UX 探索之路

01 概述 火山引擎存儲技術團隊驅動 AI 自主完成用戶體驗走查 / 可用性測試的執行與評價,幫助業務改善交互體驗。 立項“故事走查”的背景訴求和 AI 機遇 如何搭建“AI 評價”能力,精準識別交互問題 讓交互體驗故事走查變為技術產品,講解系…

【世紀龍科技】汽車零部件檢驗虛擬實訓室-助力汽車職教實訓

在汽車產業加速向電動化、智能化轉型的背景下,職業院校汽車專業教學面臨新的挑戰:傳統實訓受限于設備數量不足、操作風險高、標準化程度低等問題,導致學生實踐機會有限,技能掌握不扎實。如何讓學生在有限資源下高效掌握零部件檢驗…

MySQL常用操作 查看表描述以及表結構、連接數及緩存和性能指標

查看表描述以及表結構查看數據庫名SHOW DATABASES; SELECT DATABASE(); SELECT DATABASE() AS current_database;查看數據庫中表的列表SHOW TABLES; SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA your_database_name; SELECT TABLE_NA…

音視頻學習(三十六):websocket協議總結

概述項目描述標準RFC 6455使用端口默認 80(ws),443(wss)基于協議TCP特性全雙工、低開銷、持久連接、可穿透代理特點 全雙工通信: WebSocket 允許客戶端和服務器之間建立一個持久的連接,并且數據…

docker版本nacos的搭建

1.下載鏡像2.拷貝出容器中對應的配置文件,logs,data,conf3.編寫yaml配置文件version: 3.8 services:nacos-server:image: nacos/nacos-server:v2.4.0container_name: nacos-serverrestart: unless-stoppedports:- "8848:8848" # …