文章目錄
序列化和反序列化的概念:
- 序列化:把java對象轉換成字節流的過程;
- 反序列化:把字節流恢復為java對象的過程。
對象的序列化主要有兩種用途:
- 把對象的字節流永久的保存在硬盤上,通常存放在一個文件中(持久化對象);
- 在網絡上傳送對象的字節流(網絡傳輸對象)。
序列化數據:
- 功能特性
反序列化操作一般應用在導入模板文件、網絡通信、數據傳輸、日志格式化存儲或DB存儲等業務場景,因此審計中重點關注這些功能板塊。 - 數據特性
一般數據以rO0AB
開頭,基本上可以確定這串就是JAVA反序列化base64加密的數據;如果aced
(16進制)開頭,那么它就是一段java序列化的16進制數據。 - 序列化可能出現
http參數、cookie、session、存儲方式可能是base64(rO0
),壓縮后的base64(H4s
),MLL等;
Serverts http、Sockets、Session管理器,包含的協議包括:JMX、RMI、JMS、JND1等
發現
黑盒分析:數據庫出現地——觀察數據特性
白盒分析:組件安全&函數搜索&功能模塊
序列化函數API:
- JAVA:
serializable
、Extemailzable
、fastjson
、jackson
、gson
、ObjectInputStream.read
、ObjectObjectInputStream.readUnshared
等; - PHP:
serialize()
、unserialize()
- Python:
pickle
生成java反序列化payload工具-ysoserial
使用ysoserial
時,若要根據某個外部包生成payload,可以將該包復制到ysoserial
目錄下,確保paylaod的生成更加可靠。
ysoserial
最終生成的payload是aced
(16進制)的字節流,若需要編碼應該進一步進行編碼。
swagger
接口:swagger-ui.html
JAVA反序列化解密工具:SerializationDumper
java特定組件:shiro
、jboos
網鼎杯朱雀組2020 Think java