- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- PHP反序列化的原理
這篇文章主要介紹“PHP反序列化的原理”,在日常操作中,相信很多人在PHP反序列化的原理問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對大家解答”P(pán)HP反序列化的原理”的疑惑有所幫助!接下來(lái),請跟著(zhù)小編一起來(lái)學(xué)習吧!
首先看一張圖
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í)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站