php 將資料序列化和反序列化會用到兩個函式
serialize將物件格式化成有序的字串
unserialize將字串還原成原來的物件
序列化的目的是方便資料的傳輸和儲存,在php中,序列化和反序列化一般用做快取,比如session快取,cookie等。
o:4:"test":2:序列化的時候需要注意#了解php的序列化之後字串的含義
public,protected,private訪問修飾符,分別對應著類中的 公有、私有、受保護成員。引用解釋 不同的訪問修飾符對應的序列化也有不同。 各訪問修飾符序列化後的區別:輸出則會導致不可見字元\x00的丟失public:屬性被序列化的時候屬性名還是原來的屬性名,沒有任何改變
protected:屬性被序列化的時候屬性名會變成%00*%00 屬性名,長度跟隨屬性名長度而改變
private:屬性被序列化的時候屬性名會變成%00 類名%00 屬性名,長度跟隨屬性名長度而改變
輸出時一般需要url編碼
o:4:"test":2:
__wakeup() //執行unserialize()時,先會呼叫這個函式上傳檔案,發現 id 引數,肯定和 sql 注入有關,但是怎麼利用呢??不知道了__sleep() //執行serialize()時,先會呼叫這個函式
__destruct() //物件被銷毀時觸發
__call() //在物件上下文中呼叫不可訪問的方法時觸發
__callstatic() //在靜態上下文中呼叫不可訪問的方法時觸發
__get() //用於從不可訪問的屬性讀取資料或者不存在這個鍵都會呼叫此方法
__set() //用於將資料寫入不可訪問的屬性
__isset() //在不可訪問的屬性上呼叫isset()或empty()觸發
__unset() //在不可訪問的屬性上使用unset()時觸發
__tostring() //把類當作字串使用時觸發,比如使用 echo 或者 .連線 或者 file_exists()判斷也會觸發
__invoke() //當嘗試將物件呼叫為函式時觸發
原來通過搜尋關鍵字,可以在 github 上的得到原始碼
關鍵原始碼反序列,顯示屬性,
序列化,儲存屬性
檢查屬性,這裡唯一可控的是 filename,進而控制-->引數 title,因為要儲存,和資料庫互動,存在 sql 注入
讀 flag 的方法
上傳的 sql 語句
insert into images (`title`,`filename`,`ext`,`path`,`attr`) values('tim截圖根據原始碼,寫序列化指令碼
<?phpclass 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->indexindex 屬性在 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 將序列化過儲存到檔案中的資料,恢復到程式 的變數表示形式的過程。簡化就是 將檔案變為記憶體 物件的序列化 為什麼物件序列化,因為物件沒有對應實體,記憶體資料是 稍縱即逝 的 通常,程式執...