前言
序列化是將變數或物件轉換成字串的過程
反序列化就是把一個物件變成可以傳輸的字串,目的就是為了方便傳輸
而反序列化漏洞就是,假設,我們寫了一個class,這個class裡面存有一些變數。當這個class被例項化了之後,在使用過程中裡面的一些變數值發生了改變,之所以會產生反序列化漏洞是因為應用程式在處理物件、魔術函式以及序列化相關問題的時候導致的,那麼使用者就可以注入精心構造的 payload。當進行反序列化的時候就有可能會觸發物件中的一些魔術方法,造成意想不到的危害。
靶場環境
需要java 15以及java 8
WebGoat-8.2.2靶場
環境搭建
java -version //檢視java版本
java15 //切換java15環境
//不懂切換的老鐵可以參考以下連結
https://www.cnblogs.com/BlogVice-2203/p/17037847.html
java -jar webgoat-server-8.2.2.jar --server.port=8080 --server.addres=0.0.0.0 //啟動靶場,且靶場的埠為8080
如果不寫--server.port=8080 --server.addres=0.0.0.0 會預設使用靶場的9001埠
瀏覽器訪問localhost:8080/WebGoat
註冊一個賬號密碼均為admin123的賬號
註冊成功後就會自動彈出以下介面,然後點選不安全序列化
java反序列化漏洞復現
java的序列化是由java.io.ObjectOutputStream類中的writeObject()函式實現的,而反序列化是由於java.io.ObjectInputStream類中的readObject()函式實現的頁面提示讓我們將要執行的程式碼進行序列化,然後base64編碼,這裡有個rO0AB開頭的字串編碼,這個是java序列化的base64編碼,也就是說他要我們進行序列化後還要再編碼一次
並且這裡還有一個可以執行系統命令的函式exec,我們可以在構造payload中寫入命令執行程式碼,這裡由於是windows系統,我就直接執行calc.exe開啟計算器
開始構造payload,這裡用到java8來執行程式
java -Dhibernate5 -cp hibernate-core-5.4.28.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload Hibernate1 calc.exe >payload1.bin
注:-Dhibernate5對應我們要使用的hibernate-core-5.4.28.Final.jar主鍵,ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload是用來生成payload,Hibernate1是ysoserial程式的一個加密模組,calc.exe >payload1.bin是將calc.exe執行程式寫入到payload1.bin檔案
python java_base64.py //將payload1.bin進行base64編碼
生成成功後檢視payload1.txt,將裡面的編碼複製到頁面執行框裡進行執行,執行完成後自己電腦會出現計算器介面