php序列化與反序列化

文章目錄

  • 基礎知識
    • 魔術方法:在序列化和反序列化過程中自動調用的方法
    • 什么是 `__destruct()` 方法?
    • 何時觸發 `__destruct()` 方法?
    • 用途:
    • 語法示例:
  • 反序列化漏洞利用
    • 前提條件
    • 一些繞過策略
      • 繞過__wakeup函數
      • 繞過正則匹配
      • 繞過相等邏輯判斷
      • 利用大S的ascll碼繞過
      • 反序列化字符逃逸
  • 高級反序列化
    • phar反序列化
      • 什么是 PHAR 文件?
        • 特點
    • session反序列化

基礎知識

序列化:將對象轉化為一個可傳輸的字符串,serialize()
反序列化:將字符串重新轉化為對象
只有類的屬性可以序列化,方法不可以
如果屬性權限為private,那么序列化后,存儲的屬性名字為%00+類名+%00+屬性名
如果屬性權限為protected,那么序列化后,存儲的屬性名字為%00+*+%00+屬性名

<?php
類的屬性可以是類
class ctf{public $name;
} 
class user{public $type='vip';
}
$c=new ctf();
$c->name=new user();
echo $c->name->type;

魔術方法:在序列化和反序列化過程中自動調用的方法

1. _sleep()方法在序列化時自動調用
2. _wakeup()方法在反序列化時自動調用 
3. 反序列化時自動調用_destruct析構方法,方法內惡意代碼也會被執行
4. 執行類不存在的方法時自動調用_call方法,執行不存在的static方法時會調用_callstatic()方法
5. _get方法在訪問不存在屬性時自動調用,_set方法在寫入不存在屬性時自動調用
6. _isset()方法和_unset()方法
7. _tostring()方法,把對象和字符串拼接或者當字符串用時自動調用
8. _invoke()方法,當類的實例被當作函數調用
9.  __set_state 方法,文檔中說執行 var_export時自動調用
10.  __debugInfo 方法的屬性修飾符,執行var_dump時自動調用
11.  __clone方法,當使用clone關鍵字 ,clone一個對象時,會自動調用

在這里插入圖片描述

什么是 __destruct() 方法?

__destruct() 是 PHP 中的一個魔術方法(magic method),它用于在對象銷毀時自動執行一些清理操作,比如釋放資源或關閉數據庫連接。這個方法會在對象生命周期結束時自動調用,無需手動觸發。

何時觸發 __destruct() 方法?

__destruct() 方法在以下情況下被自動調用:

  1. 對象被銷毀時:當對象不再被使用時,PHP 會自動調用 __destruct()
  2. 腳本結束時:當腳本執行結束時,所有未銷毀的對象都會調用 __destruct()
  3. 手動銷毀對象:當調用 unset() 或者賦值 null 給對象時,__destruct() 會被觸發。

用途:

  • 釋放資源:比如關閉數據庫連接、關閉文件句柄、釋放內存等。
  • 清理工作:可以用于日志記錄、清理臨時文件等。

語法示例:

class MyClass {public function __construct() {echo "對象創建了!\n";}public function __destruct() {echo "對象銷毀了!\n";}
}$obj = new MyClass();  // 輸出:對象創建了!
unset($obj);            // 輸出:對象銷毀了!

反序列化漏洞利用

前提條件

  • 存在反序列化提交的入口
  • 有被反序列化的類的魔術方法

一些繞過策略

繞過__wakeup函數

條件:

  1. php5至php5.6.25 之間的版本可以繞過
  2. php7到php7.0.10 直接的版本可以繞過

繞過方法:

反序列化字符串中表示屬性數量的值大于大括號內實際屬性的數量時 ,wakeup方法會被繞過

繞過正則匹配

參數有過濾,不讓輸入O:數字的形式,試圖防止反序列化某個對象

O:數字 改為 O:+數字 就可以繞過上面的O:數字 過濾

繞過相等邏輯判斷

eg $a->name=&$b

采用&符號,使得a的值與b的值恒相等

利用大S的ascll碼繞過

大寫S可以支持ascll值的字符,可以借助這個特性繞過一些被過濾的字符

O:8:"backdoor":1:{s:4:"name";s:10:"phpinfo();";}O:8:"backdoor":1:{S:4:"n\97me";s:10:"phpinfo();";}

反序列化字符逃逸

在一些關鍵詞被替換后,描述中的字符數量是按照未替換之前的字符來計算,當替換后字符數量大于描述數量時,就可以逃逸出一些字符

高級反序列化

phar反序列化

什么是 PHAR 文件?

PHAR(PHP Archive)文件是一種將多個 PHP 文件、資源和其他數據打包成一個單一的歸檔文件的格式。它類似于 .tar.zip 文件,允許將整個 PHP 應用或庫打包為一個文件,方便分發和部署。

特點
  • 自包含:PHAR 文件可以包含 PHP 腳本和其他資源(如圖片、配置文件等),可以作為一個獨立的文件運行。
  • 可執行:PHAR 文件可以像普通的 PHP 腳本一樣執行,通過 php archive.phar 來運行。
  • 壓縮支持:PHAR 文件支持壓縮,可以通過 .tar, .gzip.bzip2 等格式進行壓縮。

$phar->setmetadata($h);

metadata可以放一個類實例,生成phar后,會將這個類實例序列化字符串放到phar文件內,當使用phar協議加載phar文件時,會自動反序列化這個類的序列化字符串

include
file_get_contents
file_put_contents
.use.ini
等與文件相關的函數都可以包含phar協議,從而自動調用其魔術方法

phar協議哪里使用的多?

  • 存在文件上傳點
  • 能找到file_exists()等文件讀取函數,通過控制phar://頭,就能解析phar包來自動進行反序列化

session反序列化

  • php的session是存放在文件中的 默認位置是/tmp/sess_PHPSESSID

  • session 是可以放字符串,數字,也可以放對象

    1. session里面存放對象時,會自動進行序列化,存放序列化后的字符串
    2. session里面拿取對象時,會自動進行反序列化,執行對象的魔術方法

u|O:4:“user”:2:{s:8:“username”;N;s:8:“password”;N;} 屬于php處理器
以數組類型來存,屬于php_serialize處理器
如果用php_serialize處理器來存,就可以在username中注入|,但是如果用php處理器來取時,就會把|右邊的內容進行反序列化,反序列化之后就會調用惡意類的實例,在銷毀時就會調用析構方法

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

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

相關文章

docker 占用系統空間太大了,整體遷移到掛載的其他磁盤|【當前普通用戶使用docker時,無法指定鏡像、容器安裝位置【無法指定】】

文章目錄 前言【核心步驟皆為 大模型生成的方案】總結步驟應該是&#xff1a;詳細步驟如下1. **停止 Docker 服務**2. **備份原數據&#xff08;防止遷移失敗&#xff09;**3. **遷移數據到新磁盤**4. **修改 Docker 配置文件**5. **重啟 Docker 服務**6. **驗證容器和鏡像**7.…

設計后端返回給前端的返回體

目錄 1、為什么要設計返回體&#xff1f; 2、返回體包含哪些內容&#xff08;如何設計&#xff09;&#xff1f; 舉例 3、總結 1、為什么要設計返回體&#xff1f; 在設計后端返回給前端的返回體時&#xff0c;通常需要遵循一定的規范&#xff0c;以確保前后端交互的清晰性…

Springboot 自動化裝配的原理

Springboot 自動化裝配的原理 SpringBoot 主要作用為&#xff1a;起步依賴、自動裝配。而為了實現這種功能&#xff0c;SpringBoot 底層主要使用了 SpringBootApplication 注解。 首先&#xff0c;SpringBootApplication 是一個復合注解&#xff0c;它結合了 Configuration、…

基于vue框架的游戲博客網站設計iw282(程序+源碼+數據庫+調試部署+開發環境)帶論文文檔1萬字以上,文末可獲取,系統界面在最后面。

系統程序文件列表 項目功能&#xff1a;用戶,博客信息,資源共享,游戲視頻,游戲照片 開題報告內容 基于FlaskVue框架的游戲博客網站設計開題報告 一、項目背景與意義 隨著互聯網技術的飛速發展和游戲產業的不斷壯大&#xff0c;游戲玩家對游戲資訊、攻略、評測等內容的需求日…

算法-二叉樹篇13-路徑總和

路徑總和 力扣題目鏈接 題目描述 給你二叉樹的根節點 root 和一個表示目標和的整數 targetSum 。判斷該樹中是否存在 根節點到葉子節點 的路徑&#xff0c;這條路徑上所有節點值相加等于目標和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否則&#xff0c;返回…

8. 示例:對32位數據總線實現位寬和值域覆蓋

文章目錄 前言示例一&#xff1a;示例二&#xff1a;示例三&#xff1a;仿真與覆蓋率分析覆蓋點詳細說明覆蓋率提升技巧常見錯誤排查 示例四&#xff1a;仿真步驟 前言 針對32位數據總線實現位寬和值域的覆蓋&#xff0c;并且能夠用xrun運行&#xff0c;查看日志和波形。cover…

TDengine 中的數據庫

數據庫概念 時序數據庫 TDengine 中數據庫概念&#xff0c;等同于關系型數據庫 MYSQL PostgreSQL 中的數據庫&#xff0c;都是對資源進行分割管理的單位。 TDengine 數據庫與關系型數據庫最大區別是跨庫操作&#xff0c;TDengine 數據庫跨庫操作除了少量幾個SQL 能支持外&…

開源電商項目、物聯網項目、銷售系統項目和社區團購項目

以下是推薦的開源電商項目、物聯網項目、銷售系統項目和社區團購項目&#xff0c;均使用Java開發&#xff0c;且無需付費&#xff0c;GitHub地址如下&#xff1a; ### 開源電商項目 1. **mall** GitHub地址&#xff1a;[https://github.com/macrozheng/mall](https://git…

如何設計一個短鏈系統?

短鏈系統設計的關鍵要點: 系統功能實現 短鏈生成:接收長鏈接,先檢查是否已有對應短鏈,存在則直接返回。否則,使用分布式 ID 生成器(如號段模式、SnowFlake 算法、數據庫自增 ID、Redis 自增等)生成唯一 ID,或通過哈希算法(如 MurmurHash)處理長鏈接得到哈希值。再將生…

數據結構(初階)(三)----單鏈表

單鏈表 概念 概念&#xff1a;鏈表是?種物理存儲結構上?連續、?順序的存儲結構&#xff0c;數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。 結點 與順序表不同的是&#xff0c;鏈表的結構類似于帶車頭的火車車廂&#xff0c;&#xff0c;鏈表的每個車廂都是獨立…

游戲引擎學習第129天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 小妙招: vscode:定位錯誤行 一頓狂按F8 重構快捷鍵:F2 重構相關的變量 回顧并為今天的內容做準備 今天的工作主要集中在渲染器的改進上&#xff0c;渲染器現在運行得相當不錯&#xff0c;得益于一些優化和組織上的改進。我們計…

文字描邊實現內黃外綠效果

網頁使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黃色文字 */-webkit-text-stroke: 2px #008000; /* 綠色描邊&#xff08;兼容Webkit內核&#xff09; */text-stroke: 2px #008000; /* 標準語法 *…

yolov8 目標追蹤 (源碼 +效果圖)

1.在代碼中 增加了s鍵開始追蹤 e鍵結束追蹤 顯示移動距離(代碼中可調標尺和像素的比值 以便接近實際距離) 2.繪制了監測區域 只在區域內的檢測 3.規定了檢測的類別 只有人類才繪制軌跡 import osimport cv2 from ultralytics import YOLO from collections import defaultdic…

2.5 運算符2

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請在顯著位置標明本文出處以及作者網名&#xff0c;未經作者允許不得用于商業目的 2.5.3 賦值運算符 賦值運算符將值存儲在左操作數指定的對象中。有兩種賦值操作&#xff1a; 1、簡單賦值&#xff0c;使用。其中第二…

地彈與振鈴

地彈&#xff08;Ground Bounce&#xff09;和振鈴&#xff08;Ringing&#xff09;是數字電路中常見的信號完整性問題&#xff0c;兩者都與高速開關和寄生參數有關&#xff0c;但表現形式和成因不同。以下是它們的對比及解決方法&#xff1a; 1. 地彈&#xff08;Ground Bounc…

解決Deepseek“服務器繁忙,請稍后再試”問題,基于硅基流動和chatbox的解決方案

文章目錄 前言操作步驟步驟1&#xff1a;注冊賬號步驟2&#xff1a;在線體驗步驟3&#xff1a;獲取API密鑰步驟4&#xff1a;安裝chatbox步驟5&#xff1a;chatbox設置 價格方面 前言 最近在使用DeepSeek時&#xff0c;開啟深度思考功能后&#xff0c;頻繁遇到“服務器繁忙&am…

二十三種設計模式

2 工廠方法模式 工廠模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式&#xff0c;它提供了一種創建對象的最佳方式。 在工廠模式中&#xff0c;我們在創建對象時不會對客戶端暴露創建邏輯&#xff0c;并且是通…

基于C語言對CAPL語法基礎的理解

.CAPL是基于C語言開發的&#xff0c;專門用于CANalyzer和CANoe工具環境&#xff0c;但是CAPL簡化了C語言&#xff0c;移除了復雜的指針概念&#xff0c;和一些不常用的關鍵字。 2.CAPL 腳本是基于事件驅動的&#xff0c;任何事件都有可能觸發CAPL腳本的執行&#xff0c;比如&a…

【Java SE】Java中String的內存原理

參考筆記&#xff1a; Java String 類深度解析&#xff1a;內存模型、常量池與核心機制_java stringx、-CSDN博客 解析java中String的內存原理_string s1 new string("ab");內存分析-CSDN博客 目錄 1.String初識 2.字符串字面量 3.內存原理圖 4. 示例驗證 4.…

Prometheus + Grafana 監控

Prometheus Grafana 監控 官網介紹&#xff1a;Prometheus 是一個開源系統 監控和警報工具包最初由 SoundCloud 構建。自 2012 年成立以來&#xff0c;許多 公司和組織已經采用了 Prometheus&#xff0c;并且該項目具有非常 活躍的開發人員和用戶社區。它現在是一個獨立的開源…