談談PHP反序列基礎和簡單利用

2022-09-20 08:36:13 字數 3278 閱讀 6972

序列化其實就是將資料轉化成一種可逆的資料結構,自然,逆向的過程就叫做反序列化。

php 將資料序列化和反序列化會用到兩個函式

serialize將物件格式化成有序的字串

unserialize將字串還原成原來的物件

序列化的目的是方便資料的傳輸和儲存,在php中,序列化和反序列化一般用做快取,比如session快取,cookie等。

o:4:"test":2:

#了解php的序列化之後字串的含義

序列化的時候需要注意

public,protected,private訪問修飾符,分別對應著類中的 公有、私有、受保護成員。引用解釋 不同的訪問修飾符對應的序列化也有不同。 各訪問修飾符序列化後的區別: 

public:屬性被序列化的時候屬性名還是原來的屬性名,沒有任何改變

protected:屬性被序列化的時候屬性名會變成%00*%00 屬性名,長度跟隨屬性名長度而改變

private:屬性被序列化的時候屬性名會變成%00 類名%00 屬性名,長度跟隨屬性名長度而改變

​輸出時一般需要url編碼

輸出則會導致不可見字元\x00的丟失

o:4:"test":2:

__wakeup() //執行unserialize()時,先會呼叫這個函式

__sleep() //執行serialize()時,先會呼叫這個函式

__destruct() //物件被銷毀時觸發

__call() //在物件上下文中呼叫不可訪問的方法時觸發

__callstatic() //在靜態上下文中呼叫不可訪問的方法時觸發

__get() //用於從不可訪問的屬性讀取資料或者不存在這個鍵都會呼叫此方法

__set() //用於將資料寫入不可訪問的屬性

__isset() //在不可訪問的屬性上呼叫isset()或empty()觸發

__unset() //在不可訪問的屬性上使用unset()時觸發

__tostring() //把類當作字串使用時觸發,比如使用 echo 或者 .連線   或者 file_exists()判斷也會觸發

__invoke() //當嘗試將物件呼叫為函式時觸發

上傳檔案,發現 id 引數,肯定和 sql 注入有關,但是怎麼利用呢??不知道了

原來通過搜尋關鍵字,可以在 github 上的得到原始碼

關鍵原始碼反序列,顯示屬性,

序列化,儲存屬性

檢查屬性,這裡唯一可控的是 filename,進而控制-->引數 title,因為要儲存,和資料庫互動,存在 sql 注入

讀 flag 的方法

上傳的 sql 語句

insert into images (`title`,`filename`,`ext`,`path`,`attr`) values('tim截圖

根據原始碼,寫序列化指令碼

<?php 

class helper

$a = new helper();

echo serialize($a);

?>

o:6:"helper":2:因為 protected 屬性,需要\0填補payload:o:6:"helper":2:有雙引號過濾,無法傳遞,這裡注意 sql 語句可以使用 16 進製繞過

修改 filename,得 flag

字元逃逸,一定是 先 serialize(),然後 過濾字串長度發生變化,然後 unserialize() 。從而實現逃逸,不管字元增多 or 字元減少,都一樣,就是我們構造的都是反序列化之後的字串

主要分兩種

過濾後字串增加

例題[0ctf 2016]piapiapia

過濾後字串減少

[安洵杯 2019]easy_serialize_php

get部分:?f=show_image

​post部分:_session[user]=flagflagflagflagflagflagflag&_session[function]=a:2:

-回顯:$flag = 'flag in /d0g3_fllllllag';pop 面向屬性程式設計(property-oriented programing) 常用於上層語言構造特定呼叫鏈的方法。

簡單看例題,即可理解

例題[強網杯 2019]upload-你以為我 upload,其實考**審計-pop 鏈

__get() 在呼叫不可訪問的屬性的時候觸發

__call() 在呼叫不可訪問的方法的時候觸發

這裡,我們如果把

$this->checher
賦值為 profile 物件,那麼就會呼叫 profile 物件中的 index() 方法,這個方法在 profile 中是不存在的,所以會呼叫

__call()
call方法又會呼叫

$this->index
index 屬性在 profile 中也是不存在的,就會觸發

__get()方法,那麼我們再設定 profile 中的

except[』index『]
為 upload_img 的話,就會成功觸發 upload_img() 。

register -> __destruct

profile -> __call

profile -> __get

profile -> upload_img

剛開始報錯沒有反應,多重新整理幾次,即可訪問

php序列化和反序列化

把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 1.建立乙個 arr陣列用於儲存使用者基本資訊,並在瀏覽器中輸出檢視結果 arr array arr name 張三 arr age 22 arr 男 arr phone 12...

php序列化和反序列化

序列化與反序列化 把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 1.建立乙個 arr陣列用於儲存使用者基本資訊,並在瀏覽器中輸出檢視結果 arr array arr name 張三 arr age 22 arr 男 arr...

PHP類基礎(12)之序列化和反序列化

序列化 serialize 將記憶體的變數資料,儲存 到檔案中的持久資料的過程 反序列化 unserialize 將序列化過儲存到檔案中的資料,恢復到程式 的變數表示形式的過程。簡化就是 將檔案變為記憶體 物件的序列化 為什麼物件序列化,因為物件沒有對應實體,記憶體資料是 稍縱即逝 的 通常,程式執...