电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java序列化反序列化原理及漏洞解決方案

瀏覽:3日期:2022-08-27 14:25:34

Java序列化

Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。

Java反序列化

反序列化就是將字節序列恢復為Java對象的過程

整個過程都是 Java 虛擬機(JVM)獨立的,也就是說,在一個平臺上序列化的對象可以在另一個完全不同的平臺上反序列化該對象,因此可以實現多平臺之間的通信、對象持久化存儲,主要有如下幾個應用場景。

HTTP:多平臺之間的通信,管理等

RMI:是 Java 的一組擁護開發分布式應用程序的 API,實現了不同操作系統之間程序的方法調用。值得注意的是,RMI 的傳輸 100% 基于反序列化,Java RMI 的默認端口是1099端口。

JMX:JMX 是一套標準的代理和服務,用戶可以在任何 Java 應用程序中使用這些代理和服務實現管理,中間件軟件 WebLogic 的管理頁面就是基于 JMX 開發的,而 JBoss 則整個系統都基于 JMX 構架。

系列化反序列化基礎

序列化和反序列化本身并不存在問題。但當輸入的反序列化的數據可被用戶控制,那么攻擊者即可通過構造惡意輸入,讓反序列化產生非預期的對象,在此過程中執行構造的任意代碼。

一個類的對象能夠序列化的成功需要兩個條件

該類必須實現 java.io.Serializable 接口 該類的所有屬性必須是可序列化的。如果有一個屬性不是可序列化的,則該屬性必須注明是短暫的。

漏洞基本原理

簡單的反序列化Demo

首先定義對象類Persion,包含兩個參數

public class implements java.io.Serializable{ public String name; public int age; public void info(){ System.out.println('Name:'+this.name+';nAge:'+this.age); }}

在主類中聲明對象,并且將對象序列化為二進制文件,將其存儲到硬盤中

import java.io.*;public class Main{ public static void main(String [] args){ 將對象序列化為二進制文件 Persion p = new Persion(); p.name = 'Joner'; p.age = 18; try { //打開一個文件輸入流 FileOutputStream fileOut = new FileOutputStream('D:testtest.db'); //建立對象輸入流 ObjectOutputStream out = new ObjectOutputStream(fileOut); //輸出反序列化對象 out.writeObject(p); out.close(); fileOut.close(); System.out.printf('保存成功'); }catch(IOException i){ i.printStackTrace(); }}

進行反序列化

import java.io.*;public class Main{ public static void main(String [] args){ /*從二進制文件中提取對象*/ Persion persion = null; try{ FileInputStream fileInputStream = new FileInputStream('D:testtest.db'); //建立對象輸入流 ObjectInputStream inputStream = new ObjectInputStream(fileInputStream); persion = (Persion) inputStream.readObject(); inputStream.close(); fileInputStream.close(); }catch (ClassNotFoundException c){ System.out.println('對象未找到'); c.printStackTrace(); return; } catch (FileNotFoundException e) { e.printStackTrace(); return; } catch (IOException e) { e.printStackTrace(); return; } System.out.println('反序列化對象.......'); System.out.println('Name:'+persion.name); System.out.println('Age:'+persion.age); }}

查看test.db文件的內容可以看見如下內容

其中 AC ED 00 05 是java 序列化內容的特征,其中00 05 是版本信息,base64編碼后為ro0AB

反序列化漏洞Demo

在上面的Demo中可以看到,進行反序列化時會調用readObject()方法,如果readObject方法書寫不當就會引發漏洞。

import java.io.*;public class Main{ public static void main(String [] args)throws Exception{ Unsafeclass unsafeclass = new Unsafeclass(); unsafeclass.name = 'hhhhh'; FileOutputStream fileOutputStream = new FileOutputStream('object'); ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); //將對象寫入object文件 objectOutputStream.writeObject(unsafeclass); objectOutputStream.close(); //從文件中反序列化對象 FileInputStream fileInputStream = new FileInputStream('object'); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); //恢復對象 Unsafeclass objectFormDisk = (Unsafeclass)objectInputStream.readObject(); System.out.println(objectFormDisk.name); objectOutputStream.close(); }}class Unsafeclass implements Serializable{ public String name; //重寫readObject()方法 private void readObject(java.io.ObjectInputStream inputStream ) throws IOException , ClassNotFoundException{ //執行默認的readObdect()方法 inputStream.defaultReadObject(); //執行打開計算器命令 Runtime.getRuntime().exec('calc.exe'); }}

程序運行過程為:

UnsafeClass類背序列化進入object文件 從object文件中恢復對象 調用被恢復對象的readObject()方法 命令被執行

這樣看感覺并不會有人會這樣寫readobject()這個方法,而且一些成熟的框架都會有防范反序列化的方法,但仍有很大比例的反序列化漏洞,這主要是使用了不安全的庫造成的。上面只是介紹了簡單的Java反序列化過程,接下來會有一篇文章介紹反序列化漏洞檢測方法以及復現一些經典反序列化漏洞。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 碳刷_刷握_集电环_恒压簧_电刷厂家-上海丹臻机电科技有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 水热合成反应釜-防爆高压消解罐-西安常仪仪器设备有限公司 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 振动传感器,检波器-威海广达勘探仪器有限公司 | 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | PVC快速门-硬质快速门-洁净室快速门品牌厂家-苏州西朗门业 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 东莞工作服_东莞工作服定制_工衣订做_东莞厂服 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 环比机械| 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | 哈尔滨发电机,黑龙江柴油发电机组-北方星光 | 美能达分光测色仪_爱色丽分光测色仪-苏州方特电子科技有限公司 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 滚珠丝杆升降机_螺旋升降机_丝杠升降机-德迈传动 | 武汉宣传片制作-视频拍摄-企业宣传片公司-武汉红年影视 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 上海办公室装修,办公楼装修设计,办公空间设计,企业展厅设计_写艺装饰公司 | 钢托盘,钢制托盘,立库钢托盘,金属托盘制造商_南京飞天金属制品实业有限公司 | AR开发公司_AR增强现实_AR工业_AR巡检|上海集英科技 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 永嘉县奥阳陶瓷阀门有限公司|