WEB攻防-PHP反序列化-字符串逃逸

目錄

前置知識

字符串逃逸-減少

字符串逃逸-增多


前置知識

1.PHP 在反序列化時,語法是; 作為字段的分隔,以 } 作為結尾,結束符}之后的任何內容不會影響反序列化的后的結果

class people{

? ? public $name='lili';

? ? public $age='20';


}

var_dump(unserialize('O:6:"people":2:{s:4:"name";s:4:"lil"";s:3:"age";s:2:"20";}123245dasdsf'));

2.根據長度判斷內容

'O:6:"people":2:{s:4:"name";s:4:"lil"";s:3:"age";s:2:"20";}其中lil"是name的值

3.其中字符串必須以雙引號包裹,不能不寫或以單引號包裹;?

注意點,很容易以為序列化后的字符串是;},但對象序列化是直接}結尾

php反序列化字符逃逸,就是通過這個結尾符實現的當長度不對應的時候會出現報錯無法完成反序列化

4.什么事字符串逃逸?

就是開發者使用先將對象序列化,然后將序列化后的敏感字符進行過濾或替換,最后再進行反序列化。這個時候就有可能會產生PHP反序列化字符逃逸的漏洞。分為兩種情況:

1.字符串減少

O:4:"user":1:{s:8:"username";s:5:"admin";} -->O:4:"user":1:{s:8:"username";s:5:“hack";}

2.字符串增多

O:4:"user":1:{s:8:"username";s:5:"admin";}-->O:4:"user":1:{s:8:"username";s:5:“hacker";}

開發者可能通過這些方法來達到過濾非法字符的目的,但是卻會造成其他的問題字符串逃逸

字符串逃逸-減少

<?php
class a{public $name = "abcp";public $number = "1234";
}$data = serialize(new a());
echo '序列化:'.$data."\n";
$data = str_replace("p","",$data);//注意這個str_replace,它把p都替換為空
echo '序列化:'.$data."\n";
var_dump(unserialize($data));

也就是說它過濾了一個p之后,會吞噬一個字符,但是吞噬之后序列化字符串不符合序列化的語法規范,所以使其無法反序列化成功

這樣某種程度起到了安全的作用 ,但是如果我們使其吞噬更多內容會不會達到結果合法的目的?

解釋:原acbp中p被替換了,abc”成了一個整體,本質上就是把?”?給吞噬掉了 ,所以有多少個p就好吞噬掉多少個字符

字符串逃逸就事利用吞噬更多的字符,使序列化的字符串與后面的引號形成閉合,從而構造惡意代碼,那么吞噬多少算合適呢?一直吞噬到下一個可控點的值之前,使得下一個可控制點的第一個引號充當上一個值的結束引號,可以吞噬,也可以不吞,后面會說。如上面例子有兩個變量,通過number值構造惡意代碼,就需要吞噬到number的值前面,讓該值的第一個引號充當name的結束引號。:

O:1:"a":2:{s:4:"name";s:4:"abc";s:6:"number";s:4:"1234";}

O:1:"a":2:{s:4:"name";s:4:"abc";s:6:"number";s:4:"1234";}

需要注意的是要構造的字符串通常長度是2位數的,所以應該多逃逸一個字符

O:1:"a":2:{s:4:"name";s:?:"abc";s:6:"number";s:xx:"要構造的字符串";}

?

所以要寫19+1?個p來逃逸字符

屬性之間用一個分號分隔,就可以構造逃逸出來的惡意代碼了,如下:

O:1:"a":2:{s:4:"name";s:23:"abc";s:6:"number";s:19:";s:3:"age";i:25;}";}

構造了一個age屬性,值為25

而上面提到可以把值前面的引號也吞噬掉,其實是一樣的,吞噬掉了,我們在構造的是補回來就可以了?

O:1:"a":2:{s:4:"name";s:4:"abc";s:6:"number";s:4:"1234";}

如果它過濾的時候不止吞噬一個字符怎么辦?那樣就可能出現不會正好能吞噬到下一個可控變量引號之前的情況 ,如一次吞噬6個

class a{public $name = "abchacker";public $number = '123';
}$data = serialize(new a());
echo '序列化:'.$data."\n";
$data = str_replace("hacker","",$data);
echo '序列化:'.$data."\n";
var_dump(unserialize($data));

這種情況需要把引號吞掉,因為需要在可控變量里補字符,那么通過上面吞一個的例子,我們知道需要吞21個字符,但是21/6也是除不盡的,這時候可以直接往多了吞就好,吞噬24個是可以被出盡的,也就是4個hacker,那么多出來的,在惡意代碼中補上3個任意字符給他吞噬就可以了

字符串逃逸-增多

經過替換后,字符串增多,目標使isadmin=1

<?php
class a{public $name = "php123";public $number = '1234';public $isadmin = '0';
}$data = serialize(new a());
echo '序列化:'.$data."\n";
$data = str_replace("php","hack",$data);
echo '序列化:'.$data."\n";
var_dump(unserialize($data));

字符串增多并需要其他的可控的,使吐出的字符結合到一起最終構造成合法的序列化字符串即可

O:1:"a":3:{s:4:"name";s:xx:"hackxxx";s:6:"number";s:4:"1234";s:7:“isadmin";s:1:"1";}

";s:6:"number";s:4:"1234";s:7:"isadmin";s:1:"0";}

xxx表示還不知需要多少個hack

";s:6:"number";s:4:"1234";s:7:“isadmin";s:1:"1";}如果我們使得這串字符被吐出來,那么這樣就最終形成了一個合法的序列化字符串

O:1:"a":3:{s:4:"name";s:xx:"hackxxx ";s:6:"number";s:4:"1234";s:7:“isadmin";s:1:"1";}

因為}結束后,后面的";s:6:"number";s:4:"1234";s:7:"isadmin";s:1:"0";}會被丟棄

一個php會被替換成hack一個php吐出一個字符 “;s:6:”number“;s:4:”1234“;s:7:”isadmin“;s:1:”1“;}49個字符,所以需要輸入49php?

假設一個php會被替換成hacker一個php吐出三個字符 “;s:6:”number“;s:4:”1234“;s:7:”isadmin“;s:1:”1“;}49個字符49除以3=161,所以需要輸入16php同時將“;s:6:”number“;s:4:”1234“;s:7:”isadmin“;s:1:”1“;}改為“;s:6:”number“;s:4:”123“;s:7:”isadmin“;s:1:”1“;}這樣就是48個字符,輸入16php剛剛好

吐出的多了就在“;s:6:”number“;s:4:”1234“;s:7:”isadmin“;s:1:”1“;}紅色部分增加字符即可,如17個php等于吐出51個字符,原49位多出2位,在number補2位即可

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

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

相關文章

把生產隊的大模型Grok 3 beta用來實現字帖打磨

第一個版本&#xff0c;就是簡單的田字格&#xff0c;Grok 3 beta 思考了15s就得到了html前端代碼&#xff0c;javascript; 然而還不完美&#xff1b; 第二個版本&#xff0c;進一步&#xff0c;通過pinyin項目給漢字加上注音&#xff0c;米字格和四線格&#xff1b;&#xff…

windows+ragflow+deepseek實戰之一excel表查詢

ragflows平臺部署參考文章 Win10系統Docker+DeepSeek+ragflow搭建本地知識庫 ragflow通過python實現參考這篇文章 ragflow通過python實現 文章目錄 背景效果1、準備數據2、創建知識庫3、上傳數據并解析4、新建聊天助理5、測試會話背景 前面已經基于Win10系統Docker+DeepSeek+…

OpenCV圖像處理基礎2

接著上一篇OpenCV圖像處理基礎1繼續說。 圖像閾值處理 1、簡單閾值處理 ret, thresholded_image = cv2.threshold(image, thresh, maxval, cv2.THRESH_BINARY)thresh 是閾值,maxval 是最大值。 2、自適應閾值處理 thresholded_image = cv2.adaptiveThreshold(image, maxv…

go安裝lazydocker

安裝 先安裝go環境 https://blog.csdn.net/Yqha1/article/details/146430281?fromshareblogdetail&sharetypeblogdetail&sharerId146430281&sharereferPC&sharesourceYqha1&sharefromfrom_link 安裝lazydocker go install github.com/jesseduffield/laz…

【架構】單體架構 vs 微服務架構:如何選擇最適合你的技術方案?

文章目錄 ?前言?一、架構設計的本質差異&#x1f31f;1、代碼與數據結構的對比&#x1f31f;2、技術棧的靈活性 ?二、開發與維護的成本博弈&#x1f31f;1、開發效率的階段性差異&#x1f31f;2、維護成本的隱形陷阱 ?三、部署與擴展的實戰策略&#x1f31f;1、部署模式的本…

C#實現分段三次Hermite插值

目錄 一、Hermite插值介紹 1、功能說明 2、數學方法 二、代碼實現 1、CubicHermiteInterpolator類封裝 2、應用示例 三、導數值的獲取方式 1、數學方法介紹 2、代碼應用示例 四、其它封裝的分段三次Hermite插值類 1、方式一 &#xff08;1&#xff09;封裝代碼 &…

重要重要!!fisher矩陣元素有什么含義和原理; Fisher 信息矩陣的形式; 得到fisher矩陣之后怎么使用

fisher矩陣元素有什么含義和原理 目錄 fisher矩陣元素有什么含義和原理一、對角線元素( F i , i F_{i,i} Fi,i?)的含義與原理二、非對角線元素( F i , j F_{i,j} Fi,j?)的含義與原理Fisher 信息矩陣的形式矩陣的寬度有位置權重數量決定1. **模型參數結構決定矩陣維度**2.…

【STM32】uwTick在程序中的作用及用法,并與Delay函數的區別

一、uwTick 的作用 1.系統時間基準 uwTick 是一個全局變量&#xff08;volatile uint32_t&#xff09;&#xff0c;記錄系統啟動后的毫秒級時間累計值。默認情況下&#xff0c;它由 SysTick 定時器每 ?1ms 自動遞增一次&#xff08;通過 HAL_IncTick() 函數。例如&#xff0…

docker速通

docker 鏡像操作搜索鏡像拉取鏡像查看鏡像刪除鏡像 容器操作!查看容器運行容器run命令詳細介紹 啟動容器停止容器重啟容器查看容器狀態查看容器日志刪除容器進入容器 保存鏡像提交保存加載 分享社區登錄命名推送 docker存儲目錄掛載卷映射查看所有容器卷創建容器卷查看容器卷詳…

OpenCV旋轉估計(5)圖像拼接的一個函數waveCorrect()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 waveCorrect 是OpenCV中用于圖像拼接的一個函數&#xff0c;特別適用于全景圖拼接過程中校正波浪形失真&#xff08;Wave Correction&#xff09…

Python、MATLAB和PPT完成數學建模競賽中的地圖繪制

參加數學建模比賽時&#xff0c;很多題目——諸如統計類、數據挖掘類、環保類、建議類的題目總會涉及到地理相關的情景&#xff0c;往往要求我們制作與地圖相關的可視化內容。如下圖&#xff0c;這是21年亞太賽的那道塞罕壩的題目&#xff0c;期間涉及到溫度、降水和森林覆蓋率…

深入了解 C# 中的 LINQ:功能、語法與應用解析

1. 什么是 LINQ&#xff1f; LINQ&#xff08;Language Integrated Query&#xff0c;語言集成查詢&#xff09;是 C# 和其他 .NET 語言中的一種強大的查詢功能&#xff0c;它允許開發者在語言中直接執行查詢操作。LINQ 使得開發者可以使用 C# 語法&#xff08;或 VB.NET&…

DeepSeek R1 本地部署指南 (3) - 更換本地部署模型 Windows/macOS 通用

0.準備 完成 Windows 或 macOS 安裝&#xff1a; DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 DeepSeek R1 本地部署指南 (2) - macOS 本地部署-CSDN博客 以下內容 Windows 和 macOS 命令執行相同&#xff1a; Windows 管理員啟動&#xff1a;命令提示符 CMD ma…

【總結】Pytest vs Behave,BDD 測試框架哪家強?

引言 在測試驅動開發(TDD)和行為驅動開發(BDD)流行的今天&#xff0c;Pytest和 Behave 成為了 Python 生態中最常見的自動化測試框架。那么&#xff0c;究竟該選擇哪一個&#xff1f;它們各自有哪些優缺點&#xff1f;本篇文章將為你全面解析&#xff01; 1. 什么是 Pytest&a…

k8s中service概述(二)NodePort

NodePort 是 Kubernetes 中一種用于對外暴露服務的 Service 類型。它通過在集群的每個節點上開放一個靜態端口&#xff08;NodePort&#xff09;&#xff0c;使得外部用戶可以通過節點的 IP 地址和該端口訪問集群內部的服務。以下是關于 NodePort Service 的詳細說明&#xff1…

HTML5 Video標簽詳細教程

HTML5 Video標簽詳細教程 簡介 HTML5引入的<video>標簽為網頁提供了原生視頻播放功能&#xff0c;無需依賴Flash等第三方插件。它使得在網頁中嵌入和控制視頻內容變得簡單而強大。本教程將詳細介紹<video>標簽的使用方法、屬性、事件以及相關技術。 基本用法 最…

Linux系統崩潰破案實錄

現代計算環境中&#xff0c;系統的穩定性和可靠性至關重要。然而&#xff0c;即使是最優化的系統也可能會由于硬件故障、軟件漏洞或配置錯誤而崩潰。為了解決這一問題&#xff0c;Linux系統提供了強大的內核崩潰轉儲機制&#xff0c;本文介紹如何收集和分析崩潰日志&#xff0c…

tcping 命令的使用,ping IP 和端口

1. ?Windows系統安裝? ?下載tcping工具?&#xff1a;根據系統位數&#xff08;32位或64位&#xff09;下載對應的tcping.exe文件。?安裝步驟?&#xff1a; 將下載的tcping.exe文件復制到C:\Windows\System32目錄下。如果下載的是64位版本&#xff0c;需將文件名改為tcpi…

深度學習框架PyTorch——從入門到精通(6.1)自動微分

使用torch.autograd自動微分 張量、函數和計算圖計算梯度禁用梯度追蹤關于計算圖的更多信息張量梯度和雅可比乘積 在訓練神經網絡時&#xff0c;最常用的算法是反向傳播。在該算法中&#xff0c;參數&#xff08;模型權重&#xff09;根據損失函數的梯度相對于給定參數進行調整…

跟我學C++中級篇——std::not_fn

一、std::not_fn定義和說明 std::not_fn這個模板函數非常有意思&#xff0c;在前面我們學習過wrapper&#xff08;包裝器&#xff09;&#xff0c;其實它就是通過封裝一個包裝器來實現返回值的非。它的基本定義如下&#xff1a; template< class F > /* 未指定 */ not_…