国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

PHP反序列化的原理

發(fā)布時(shí)間:2021-09-14 11:25 來(lái)源:億速云 閱讀:0 作者:chen 欄目: 網(wǎng)絡(luò )安全 歡迎投稿:712375056

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

首先看一張圖

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

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

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

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

詳細參考這張圖

可以玩玩去年網(wǎng)鼎的青龍杯里的反序列化題我把解題思路寫(xiě)下來(lái)
網(wǎng)鼎杯青龍組php反序列化題

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

**

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

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

php
欧美人与动人物牲交免费观看久久| 少妇邻居内射在线| 久久综合色鬼综合色| 久久精品国产亚洲ΑV忘忧草| 久久精品伊人波多野结衣| 免费无码中文字幕A级毛片|