1.概念定義
序列化與反序列化的目的是讓數據在傳輸和處理的時候更簡單,更快,反序列化出現在多種同面向對象語言所開發的網站和軟件上,比如java,php,python等等,如果有語言一個都沒學的,可以先去補一下面向對象編程的概念
序列化:把對象轉化成字節流(java),或者字符串(php,python)和數組(php)
反序列:把字節流,字符串,數組轉換成對象
2.反序列漏洞出現的根本原因
我們可以通過給變量賦值序列化內容去定義一個對象,比如變量a賦值成了類A的對象的序列化內容,則變量a是類A的一個對象
這里可以看我的代碼:初學php反序列化漏洞使用的代碼-CSDN博客
于此同時,如果我們可以提交這個被反序列化的內容,我們可以通過序列化內容去定義某個對象的屬性,通過魔術方法和接口去觸發這個對象的方法,如果這個對象的某個方法或者魔術方法中出現了漏洞,我們就可以直接使用,當然觸發魔術方法可能更簡單,這里也可以看上方我的代碼。
3.針對于三種語言常用的方法
1.php
魔術方法;原生類;語言自身的漏洞
魔術方法可以在我的代碼中看見,可以自己調整代碼,查看魔術方法的觸發條件
原生類:php環境自帶的類,這個很大程度依賴于網站的環境,我的代碼中有檢測固定魔術方法的類的代碼,當然是運行在本地的,我們可以去設置貼近于網站的環境和php版本去嘗試
語言自身漏洞:在某些版本下語言自身可能產生漏洞,比如php報過wakeup魔術方法的繞過漏洞
2.java
主要出現在第三方組件和引用庫和接口上面
3.python
魔術方法:之后我會去補一下代碼
而且由于python不需要一定和網站本身具有的類相同才可以創建對象的特性,所以造成的漏洞往往更加嚴重
3.三個語言序列化的函數與庫
php:serialize序列化,unserialize反序列化
java:
java.io.ObjectOutputStream:表示對象輸出流 它的writeObject(Object obj)方法可以對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
java.io.ObjectInputStream:表示對象輸入流 它的readObject()方法從源輸入流中讀取字節序列,再把它們反序列化成為一個對象,并將其返回。
這里的不全的,要用的時候直接搜,java中序列化和反序列的接口很多
python:pickle.loads pickle.load 反序列化
? ? ? ? ? ? ? ?pickle.dumps pickle.dump 序列化
? ? ? ? ? ? ? ?帶s的是直接轉換成,不帶s的是要指定輸出的文件
4.三個語言序列化之后的特點
php:這個可以直接看我的php反序列代碼,和前面的鏈接是一樣的
java:16進制后開頭為AC ED base64加密之后 rO0AB
python:沒有特殊的特點
5.黑盒白盒
黑盒:比較難挖掘到,一般都是在數據傳輸的位置
白盒:功能追蹤,重點函數,類名的追蹤
6.案例
PHP:
1.ctfshow(對不起還是沒錢買,大家可以自己復制代碼到電腦上做)看看大佬的:ctfshow web 反序列化(web254-278)_ctfshow php反序列化-CSDN博客
2.ctf賽題:極客大挑戰2019 php(直接在平臺上搜索就可以做了,我做完之后沒截圖):
BUUCTF在線評測 (buuoj.cn)
思路總體上:通過wakeup的繞過去突破
3.typecho:先看看大佬的CVE-2018-18753 Typecho 反序列化漏洞 分析復現 - FreeK0x00 - 博客園 (cnblogs.com)
java:
CTF網鼎杯2020朱雀組 thinkjava思路記錄-CSDN博客
python:
CTFCISCN2019華北Day1 ikun 思路記錄-CSDN博客