記一些ctf出現的序列化與反序列化的知識點和題目。
序列化和反序列化的概念
序列化就是將物件轉換成字串。字串包括 屬性名 屬性值 屬性型別和該物件對應的類名。
反序列化則相反將字串重新恢復成物件。
物件的序列化利於物件的儲存和傳輸,也可以讓多個檔案共享物件。
序列化中常見的魔法函式:
__construct() 建立物件時呼叫
__destruct() 銷毀物件時呼叫
__tostring() 當乙個物件被當作乙個字串使用
__sleep() 在物件在被序列化之前執行
__wakeup 將在序列化之後立即被呼叫
看一串字串o:3:"ctf":3";s:4:"name";s:7:"sch0lar";s:3:"age";s:2:"18";}
o代表物件 因為我們序列化的是乙個物件 序列化陣列則用a來表示
3 代表類名字佔三個字元
ctf 類名
3 代表三個屬性
s代表字串
4代表屬性名長度
flag屬性名
s:13:"flag" 字串 屬性值長度 屬性值
訪問控制修飾符
根據訪問控制修飾符的不同 序列化後的 屬性長度和屬性值會有所不同,所以這裡簡單提一下
public(公有)
protected(受保護)
private(私有的)
protected屬性被序列化的時候屬性值會變成:%00*%00屬性名
private屬性被序列化的時候屬性值會變成:%00類名%00屬性名
就像這樣
o:4:"name":2://這裡是private屬性被序列化
繞過__wakeup()函式
當序列化字串表示物件屬性個數的值大於真實個數的屬性時就會跳過__wakeup的執行。
//將上面的物件屬性個數值改成逼真實個數打
o:4:"name":3:
看幾道基礎的題目
[極客大挑戰 2019]php
掃目錄拿到www.zip**的備份原始碼。
<?php
include 'flag.php';
error_reporting(0);
class name
function __wakeup()
function __destruct()
if ($this->username === 'admin') else
}}$a = new name("admin",100);
$a = serialize($a);
echo $a;
?>
得到
o:4:"name":2:
繞過__wakeup
o:4:"name":3:
private屬性被序列化的時候屬性值會變成%00類名%00屬性名,根據規則進行修改
o:4:"name":3:
然後?select傳值
?select=o:4:"name":3:
iscc2020-php is the best language(php反序列化)<?php
@error_reporting(1);
include 'flag.php';
class baby
"; if (base64_encode(file_get_contents($filename)))}}
}/*if (isset($_get['data']))
else
$html='';
if(isset($_post['test']))*/
//下面是解題**
$a = new baby("flag.php");
$a = serialize($a);
echo $a; //o:4:"baby":1:
?>
然後傳值
CTF中的序列化與反序列化
學習於 序列化就是將物件轉換成字串。字串包括 屬性名 屬性值 屬性型別和該物件對應的類名。反序列化則相反將字串重新恢復成物件。物件的序列化利於物件的儲存和傳輸,也可以讓多個檔案共享物件。construct 建立物件時呼叫 destruct 銷毀物件時呼叫 tostring 當乙個物件被當作乙個字串使...
序列化和反序列化 C 序列化與反序列化。
序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...
序列化與反序列化
把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 eg stooges array moe larry curly new serialize stooges print r new echo print r unserial...