91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP反序列化的原理

發布時間:2021-09-03 23:27:04 來源:億速云 閱讀:225 作者:chen 欄目:安全技術

這篇文章主要介紹“PHP反序列化的原理”,在日常操作中,相信很多人在PHP反序列化的原理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP反序列化的原理”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

首先看一張圖
PHP反序列化的原理PHP反序列化的原理

PHP反序列化 原理:未對用戶輸入的序列化字符串進行檢測,導致攻擊者可以控制反序列化過程,從而導致代碼執行,SQL注入,目錄遍歷等不可控后果。在反序列化的過程中自動觸發了某些魔術方法。當進行反序列化的時候就有可能會觸發對象中的一些魔術方法。

serialize() //將一個對象轉換成一個字符串
unserialize() //將字符串還原成一個對象
反序列化分為有類和無類
我們先來看序列化數據也就是序列化字符串
先上圖
PHP反序列化的原理PHP反序列化的原理

我們看看上面那張圖
s:8:"chixigua"s
s代表字符串,8代表長度“chixigua”代表值
在無類中他調用了unserialize()將字符串還原為對象沒有進行過濾我們可以觀察其代碼而構造payload進行sql注入,代碼執行,getshell,目錄遍歷等等,主要看他的代碼,他的代碼有sql語句接收序列化字符串這樣會產生反序列化sql注入其他漏洞也是如此,主要看代碼來辨別危害
反序列化也是我們面試的必考題,所以還是很重要的
在思維導圖我們提到有類在有類的情況我們會設計到各種魔術方法
我們首先來介紹一下各種魔術方法
__construct()
具有構造函數的類會在每次創建新對象時先調用此方法,所以非常適合在使用對象之前做一些初始化工作。
__destruct()
析構函數會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行。
也就是說進行反序列化時,完成的就是從字符串創建新對象的過程,剛開始就會調用__construct(),而對象被銷毀時,例如程序退出時,就會調用__destruct()
觸發:unserialize函數的變量可控,文件中存在可利用的類,類中有魔術方法:
參考:官方文檔魔法方法部分
__construct()//創建對象時觸發
__destruct() //對象被銷毀時觸發
__call() //在對象上下文中調用不可訪問的方法時觸發
__callStatic() //在靜態上下文中調用不可訪問的方法時觸發
__get() //用于從不可訪問的屬性讀取數據
__set() //用于將數據寫入不可訪問的屬性
__isset() //在不可訪問的屬性上調用isset()或empty()觸發
__unset() //在不可訪問的屬性上使用unset()時觸發
__invoke() //當腳本嘗試將對象調用為函數時觸發
接下來我們先看一段魔術方法php代碼
PHP反序列化的原理

首先先分析一下代碼創建了一個類
里面寫了3個魔術方法
我們看結果首先輸出了‘調用了構造函數’,為什么在魔術方法里的這串代碼執行了呢?這是因為觸發了他的魔術方法,因為我們將一個類進行了實體化,也就是新建了一個對象,觸發了__construct()方法里的代碼,接下來又輸出了‘調用了蘇醒函數’在反序列話函數執行的時候會先檢測__wakeup()方法有該方法這會先執行這個方法里的代碼

詳細參考這張圖

PHP反序列化的原理

可以玩玩去年網鼎的青龍杯里的反序列化題我把解題思路寫下來
網鼎杯青龍組php反序列化題

首先ctf命名及代碼函數unserialize判斷反序列化知識點
第一:獲取flag存儲flag.php
第二:兩個魔術方法__destruct __construct
第三:傳輸str參數數據后觸發destruct,存在is_valid過濾
第四:__destruct中會調用process,其中op=1寫入及op=2讀取
第五:涉及對象FileHandler,變量op及filename,content,進行構造輸出

**

<?php
class FileHandler{
    public $op=' 2';//源碼告訴我們op為1時候是執行寫入為2時執行讀
    public $filename="flag.php";//文件開頭調用的是flag.php
    public $content="zmc";
}
$flag = new FileHandler();
$flag_1 = serialize($flag);
echo $flag_1;
?>
涉及:反序列化魔術方法調用,弱類型繞過,ascii繞過
使用該類對flag進行讀取,這里面能利用的只有__destruct函數(析構函數)。__destruct函數對$this->op進行了===判斷并內容在2字符串時會賦值為1,process函數中使用==對$this->op進行判斷(為2的情況下才能讀取內容),因此這里存在弱類型比較,可以使用數字2或字符串' 2'繞過判斷。
is_valid函數還對序列化字符串進行了校驗,因為成員被protected修飾,因此序列化字符串中會出現ascii為0的字符。經過測試,在PHP7.2+的環境中,使用public修飾成員并序列化,反序列化后成員也會被public覆蓋修飾。?個人博客

到此,關于“PHP反序列化的原理”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

新宁县| 合江县| 夏邑县| 固原市| 达尔| 措勤县| 玛曲县| 沁阳市| 林甸县| 塘沽区| 洛阳市| 财经| 瑞金市| 库伦旗| 乌什县| 宜丰县| 安岳县| 寿宁县| 枝江市| 丽江市| 丁青县| 普定县| 贡觉县| 那坡县| 遵义县| 申扎县| 随州市| 曲阜市| 昌邑市| 宁阳县| 焉耆| 晋城| 华宁县| 博爱县| 吐鲁番市| 盐边县| 商丘市| 宁夏| 保德县| 宜昌市| 察雅县|