知識點:
1、安全開發-JavaEE-動態代理&序列化&反序列化
2、安全開發-JavaEE-readObject&toString方法
一、演示案例-WEB開發-JavaEE-動態代理
動態代理
代理模式Java
當中最常用的設計模式之一。其特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類,以及事后處理消息等。而Java
的代理機制分為靜態代理和動態代理,而這里我們主要重點學習java
自帶的jdk
動態代理機制
通俗來講這個動態代理可以理解為歌手的經紀人,明星本人只需要做好自己要做的事情(只負責好唱歌),假設有商務活動想邀請這個明星去唱歌,就會找歌手的經紀人(確認合同、確認金額、確認唱什么歌等等前置流程),一切確定后,歌手本人只需要去到現場唱歌即可,后續收演出費什么也都是經紀人去完成(后置流程)
1、創建接口及定義方法
2、實現接口及定義方法操作
3、實現接口及重寫invoke方法
4、創建代理對象并調用方法
安全總結:利用條件分析&執行invoke
安全案例:Ysoserial-CC1鏈-LazyMap
二、演示案例-WEB開發-JavaEE-序列化&反序列化&利用鏈&危險方法&重寫方法
1、序列化與反序列化
序列化:將內存中的對象壓縮成字節流
反序列化:將字節流轉化成內存中的對象
序列化與反序列化其實就是對象與數據格式的轉換。
2、為什么有序列化技術
序列化與反序列化的設計就是用來傳輸數據的。
當兩個進程進行通信的時候,可以通過序列化反序列化來進行傳輸。
能夠實現數據的持久化,通過序列化可以把數據永久的保存在硬盤上,也可以理解為通過序列化將數據保存在文件中。
通俗來講就是你出國旅游,不可能跟外國人直接說中文,他聽不懂,這個時候就會借助翻譯器把中文翻譯成對方識別的語言,在把對方的語言翻譯成中文。這個翻譯的過程就是序列化和反序列化
應用場景:
(1) 想把內存中的對象保存到一個文件中或者是數據庫當中。
(2) 用套接字在網絡上傳輸對象。
(3) 通過RMI傳輸對象的時候。
3、常見的創建的序列化和反序列化協議
JAVA內置的writeObject()/readObject()
JAVA內置的XMLDecoder()/XMLEncoder
XStream
SnakeYaml
FastJson
Jackson
4、為什么會出現反序列化安全問題
JAVA內置的writeObject()/readObject()內置原生寫法分析:
writeObject():主要用于將 Java 對象序列化為字節流并寫入輸出流
readObject():主要用于從輸入流中讀取字節序列反序列化為 Java 對象
FileInputStream:其主要作用是從文件讀取字節數據
FileOutputStream:其主要作用是將字節數據寫入文件
ObjectInputStream:用于從輸入流中讀取對象,實現對象的反序列化操作
ObjectOutputStream:用于將對象并寫入輸出流的類,實現對象的序列化操作
序列化-writeObject()
反序列化-readObject()
利用看下面
1、看序列化的對象有沒有重寫readObject
方法(方法里是否包含危險代碼)
2、看序列化的對象有沒有被輸出就會調用toString
方法(方法里是否包含危險代碼)
3、其他類的readObject
或toString
方法(反序列化類對象可控)
5、反序列化利用鏈
(1) 入口類的readObject直接調用危險方法
(2) 入口參數中包含可控類,該類有危險方法,readObject時調用
(3) 入口類參數包含可控類,該類又調用其他有危險方法類,readObject調用
(4) 構造函數/靜態代碼塊等類加載時隱式執行
6、反序列化利用條件
1、可控的輸入變量進行了反序列化操作
你輸入的數據被網站接收并進行了反序列化操作