站長資訊網
        最全最豐富的資訊網站

        php淺析反序列化結構知識點

        本篇文章主要給大家介紹了關于PHP的相關知識,序列化其實就是將數據轉化成一種可逆的數據結構,自然,逆向的過程就叫做反序列化。php將數據序列化和反序列化會用到兩個函數:serialize 將對象格式化成有序的字符串、unserialize 將字符串還原成原來的對象,希望對大家有幫助。

        php淺析反序列化結構知識點

        (推薦教程:PHP視頻教程)

        簡介

        序列化的目的是方便數據的傳輸和存儲,在PHP中,序列化和反序列化一般用做緩存,比如session緩存,cookie等。

        反序列化中常見的魔術方法

        • __wakeup() //執行unserialize()時,先會調用這個函數

        • __sleep() //執行serialize()時,先會調用這個函數

        • __destruct() //對象被銷毀時觸發

        • __call() //在對象上下文中調用不可訪問的方法時觸發

        • __callStatic() //在靜態上下文中調用不可訪問的方法時觸發

        • __get() //用于從不可訪問的屬性讀取數據或者不存在這個鍵都會調用此方法

        • __set() //用于將數據寫入不可訪問的屬性

        • __isset() //在不可訪問的屬性上調用isset()或empty()觸發

        • __unset() //在不可訪問的屬性上使用unset()時觸發

        • __toString() //把類當作字符串使用時觸發

        • __invoke() //當嘗試將對象調用為函數時觸發

        反序列化繞過小Trick

        php7.1+反序列化對類屬性不敏感

        我們前面說了如果變量前是protected,序列化結果會在變量名前加上x00*x00

        但在特定版本7.1以上則對于類屬性不敏感,比如下面的例子即使沒有x00*x00也依然會輸出abc

        <?php class test{     protected $a;     public function __construct(){         $this->a = 'abc';     }     public function  __destruct(){         echo $this->a;     } } unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');

        繞過_wakeup(CVE-2016-7124)

        版本:

        PHP5 < 5.6.25

        PHP7 < 7.0.10

        利用方式:序列化字符串中表示對象屬性個數的值大于真實的屬性個數時會跳過__wakeup的執行

        對于下面這樣一個自定義類

        <?php class test{     public $a;     public function __construct(){         $this->a = 'abc';     }     public function __wakeup(){         $this->a='666';     }     public function  __destruct(){         echo $this->a;     } }

        如果執行unserialize('O:4:"test":1:{s:1:"a";s:3:"abc";}');輸出結果為666

        而把對象屬性個數的值增大執行unserialize('O:4:"test":2:{s:1:"a";s:3:"abc";}');輸出結果為abc

        繞過部分正則

        preg_match('/^O:d+/')匹配序列化字符串是否是對象字符串開頭,這在曾經的CTF中也出過類似的考點

        利用加號繞過(注意在url里傳參時+要編碼為%2B)

        serialize(array(a ) ) ; / / a));//a));//a為要反序列化的對象(序列化結果開頭是a,不影響作為數組元素的$a的析構)

        <?php class test{     public $a;     public function __construct(){         $this->a = 'abc';     }     public function  __destruct(){         echo $this->a.PHP_EOL;     } } function match($data){     if (preg_match('/^O:d+/',$data)){         die('you lose!');     }else{         return $data;     } } $a = 'O:4:"test":1:{s:1:"a";s:3:"abc";}'; // +號繞過 $b = str_replace('O:4','O:+4', $a); unserialize(match($b)); // serialize(array($a)); unserialize('a:1:{i:0;O:4:"test":1:{s:1:"a";s:3:"abc";}}');

        利用引用

        <?php class test{     public $a;     public $b;     public function __construct(){         $this->a = 'abc';         $this->b= &$this->a;     }     public function  __destruct(){          if($this->a===$this->b){             echo 666;         }     } } $a = serialize(new test());

        上面這個例子將$b設置為$a的引用,可以使$a永遠與$b相等

        16進制繞過字符的過濾

        O:4:“test”:2:{s:4:“%00*%00a”;s:3:“abc”;s:7:“%00test%00b”;s:3:“def”;}

        可以寫成

        O:4:“test”:2:{S:4:“

        主站蜘蛛池模板: 国产精品美女久久久久| 精品久久久久久中文字幕| 精品亚洲综合久久中文字幕| 亚洲精品国精品久久99热| 亚洲国产精品免费视频| 久久精品夜夜夜夜夜久久| 久久亚洲国产精品五月天婷| 亚洲第一精品福利| 久久国产热精品波多野结衣AV| 欧美精品色婷婷五月综合| 91精品国产综合久久四虎久久无码一级| 欧洲精品99毛片免费高清观看| 欧美日韩综合精品| 国产在AJ精品| 在线欧美v日韩v国产精品v| 91麻豆精品视频| 久久精品国产亚洲AV香蕉| 一本一本久久aa综合精品| 人妻VA精品VA欧美VA| 久久91精品综合国产首页| 国产精品色视频ⅹxxx| 成人精品一区二区久久| 亚洲国产精品久久久久婷婷老年| 国产精品莉莉欧美自在线线| 国产成人精品男人的天堂538| 久久精品国产亚洲AV电影| 香蕉久久夜色精品升级完成| 亚洲精品视频在线观看你懂的| 久久亚洲国产精品五月天婷| 麻豆精品三级全部视频| 精品久久久久中文字| 狠狠精品久久久无码中文字幕| 黑人巨大精品欧美一区二区| 黑巨人与欧美精品一区| 久久精品国产一区二区电影| 久久狠狠一本精品综合网| 久久精品国产一区二区三区不卡| 国内精品视频九九九九| 国精品无码A区一区二区| 欧美精品色婷婷五月综合| 亚洲综合精品网站|