這篇文章主要介紹“PHP反序列化的原理”,在日常操作中,相信很多人在PHP反序列化的原理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”PHP反序列化的原理”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
這篇文章主要介紹“PHP反序列化的原理”,在日常操作中,相信很多人在PHP反序列化的原理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”PHP反序列化的原理”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、洪雅ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的洪雅網(wǎng)站制作公司
首先看一張圖PHP反序列化 原理:未對(duì)用戶輸入的序列化字符串進(jìn)行檢測,導(dǎo)致攻擊者可以控制反序列化過程,從而導(dǎo)致代碼執(zhí)行,SQL注入,目錄遍歷等不可控后果。在反序列化的過程中自動(dòng)觸發(fā)了某些魔術(shù)方法。當(dāng)進(jìn)行反序列化的時(shí)候就有可能會(huì)觸發(fā)對(duì)象中的一些魔術(shù)方法。
serialize() //將一個(gè)對(duì)象轉(zhuǎn)換成一個(gè)字符串
unserialize() //將字符串還原成一個(gè)對(duì)象
反序列化分為有類和無類
我們先來看序列化數(shù)據(jù)也就是序列化字符串
先上圖
我們看看上面那張圖
s:8:"chixigua"s
s代表字符串,8代表長度“chixigua”代表值
在無類中他調(diào)用了unserialize()將字符串還原為對(duì)象沒有進(jìn)行過濾我們可以觀察其代碼而構(gòu)造payload進(jìn)行sql注入,代碼執(zhí)行,getshell,目錄遍歷等等,主要看他的代碼,他的代碼有sql語句接收序列化字符串這樣會(huì)產(chǎn)生反序列化sql注入其他漏洞也是如此,主要看代碼來辨別危害
反序列化也是我們面試的必考題,所以還是很重要的
在思維導(dǎo)圖我們提到有類在有類的情況我們會(huì)設(shè)計(jì)到各種魔術(shù)方法
我們首先來介紹一下各種魔術(shù)方法
__construct()
具有構(gòu)造函數(shù)的類會(huì)在每次創(chuàng)建新對(duì)象時(shí)先調(diào)用此方法,所以非常適合在使用對(duì)象之前做一些初始化工作。
__destruct()
析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷毀時(shí)執(zhí)行。
也就是說進(jìn)行反序列化時(shí),完成的就是從字符串創(chuàng)建新對(duì)象的過程,剛開始就會(huì)調(diào)用__construct(),而對(duì)象被銷毀時(shí),例如程序退出時(shí),就會(huì)調(diào)用__destruct()
觸發(fā):unserialize函數(shù)的變量可控,文件中存在可利用的類,類中有魔術(shù)方法:
參考:官方文檔魔法方法部分
__construct()//創(chuàng)建對(duì)象時(shí)觸發(fā)
__destruct() //對(duì)象被銷毀時(shí)觸發(fā)
__call() //在對(duì)象上下文中調(diào)用不可訪問的方法時(shí)觸發(fā)
__callStatic() //在靜態(tài)上下文中調(diào)用不可訪問的方法時(shí)觸發(fā)
__get() //用于從不可訪問的屬性讀取數(shù)據(jù)
__set() //用于將數(shù)據(jù)寫入不可訪問的屬性
__isset() //在不可訪問的屬性上調(diào)用isset()或empty()觸發(fā)
__unset() //在不可訪問的屬性上使用unset()時(shí)觸發(fā)
__invoke() //當(dāng)腳本嘗試將對(duì)象調(diào)用為函數(shù)時(shí)觸發(fā)
接下來我們先看一段魔術(shù)方法php代碼
首先先分析一下代碼創(chuàng)建了一個(gè)類
里面寫了3個(gè)魔術(shù)方法
我們看結(jié)果首先輸出了‘調(diào)用了構(gòu)造函數(shù)’,為什么在魔術(shù)方法里的這串代碼執(zhí)行了呢?這是因?yàn)橛|發(fā)了他的魔術(shù)方法,因?yàn)槲覀儗⒁粋€(gè)類進(jìn)行了實(shí)體化,也就是新建了一個(gè)對(duì)象,觸發(fā)了__construct()方法里的代碼,接下來又輸出了‘調(diào)用了蘇醒函數(shù)’在反序列話函數(shù)執(zhí)行的時(shí)候會(huì)先檢測__wakeup()方法有該方法這會(huì)先執(zhí)行這個(gè)方法里的代碼
詳細(xì)參考這張圖
可以玩玩去年網(wǎng)鼎的青龍杯里的反序列化題我把解題思路寫下來
首先ctf命名及代碼函數(shù)unserialize判斷反序列化知識(shí)點(diǎn)第一:獲取flag存儲(chǔ)flag.php第二:兩個(gè)魔術(shù)方法__destruct __construct第三:傳輸str參數(shù)數(shù)據(jù)后觸發(fā)destruct,存在is_valid過濾第四:__destruct中會(huì)調(diào)用process,其中op=1寫入及op=2讀取第五:涉及對(duì)象FileHandler,變量op及filename,content,進(jìn)行構(gòu)造輸出
**
<?phpclass FileHandler{ public $op=' 2';//源碼告訴我們op為1時(shí)候是執(zhí)行寫入為2時(shí)執(zhí)行讀 public $filename="flag.php";//文件開頭調(diào)用的是flag.php public $content="zmc";}$flag = new FileHandler();$flag_1 = serialize($flag);echo $flag_1;?>涉及:反序列化魔術(shù)方法調(diào)用,弱類型繞過,ascii繞過使用該類對(duì)flag進(jìn)行讀取,這里面能利用的只有__destruct函數(shù)(析構(gòu)函數(shù))。__destruct函數(shù)對(duì)$this->op進(jìn)行了===判斷并內(nèi)容在2字符串時(shí)會(huì)賦值為1,process函數(shù)中使用==對(duì)$this->op進(jìn)行判斷(為2的情況下才能讀取內(nèi)容),因此這里存在弱類型比較,可以使用數(shù)字2或字符串' 2'繞過判斷。is_valid函數(shù)還對(duì)序列化字符串進(jìn)行了校驗(yàn),因?yàn)槌蓡T被protected修飾,因此序列化字符串中會(huì)出現(xiàn)ascii為0的字符。經(jīng)過測試,在PHP7.2+的環(huán)境中,使用public修飾成員并序列化,反序列化后成員也會(huì)被public覆蓋修飾。?個(gè)人博客
本文題目:PHP反序列化的原理
文章起源:http://sd-ha.com/article18/ichcgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、做網(wǎng)站、全網(wǎng)營銷推廣、搜索引擎優(yōu)化、網(wǎng)站內(nèi)鏈、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容