91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php反序列化結構是什么

發布時間:2022-07-26 16:55:59 來源:億速云 閱讀:130 作者:iii 欄目:開發技術

這篇文章主要介紹了php反序列化結構是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇php反序列化結構是什么文章都會有所收獲,下面我們一起來看看吧。

簡介

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

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

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

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

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

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

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

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

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

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

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

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

  11. __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:“\00*\00\61”;s:3:“abc”;s:7:“%00test%00b”;s:3:“def”;}

表示字符類型的s大寫時,會被當成16進制解析。

關于“php反序列化結構是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“php反序列化結構是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

开鲁县| 韶关市| 卫辉市| 宜川县| 罗山县| 满城县| 定陶县| 宁陵县| 卫辉市| 驻马店市| 阳春市| 马公市| 和政县| 惠水县| 洛阳市| 河东区| 孟村| 兴业县| 怀来县| 罗甸县| 内丘县| 洪泽县| 寻乌县| 天门市| 丹巴县| 精河县| 武邑县| 溧阳市| 鄂托克旗| 鄂伦春自治旗| 丹巴县| 漠河县| 中宁县| 凉城县| 福建省| 扎鲁特旗| 河北省| 武威市| 渑池县| 双柏县| 休宁县|