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

溫馨提示×

溫馨提示×

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

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

Ezpop?pop序列化鏈反序列化實例分析

發布時間:2022-04-12 10:34:27 來源:億速云 閱讀:161 作者:iii 欄目:開發技術

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

<?php
//flag is in flag.php
//WTF IS THIS?
//Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95
//And Crack It!
class Modifier {
    protected  $var;
    public function append($value){
        include($value);
    }
    public function __invoke(){
        $this->append($this->var);
    }
}
class Show{
    public $source;
    public $str;
    public function __construct($file='index.php'){
        $this->source = $file;
        echo 'Welcome to '.$this->source."<br>";
    }
    public function __toString(){
        return $this->str->source;
    }
    public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }
    }
}
class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }
    public function __get($key){
        $function = $this->p;
        return $function();
    }
}
if(isset($_GET['pop'])){
    @unserialize($_GET['pop']);
}
else{
    $a=new Show;
    highlight_file(__FILE__);
}

一大段代碼,隨意瞟一眼看見wakeup等魔法方法,我就知道要利用反序列化了,還有include文件包含漏洞,但這里考的不是如何繞過反序列化,而是我不知道的序列化POP鏈。

根據學習,以下是我的心得:

__invoke:當嘗試將該函數所存在的對象用函數方法調用時觸發

__construct:當一個對象被創建時調用,類似于構造函數

__toString:當對象被當作字符串使用時調用

__wakeup:當調用unserialize反序列化的時候提前調用

__get:當調用不可訪問的屬性時調用該函數(1、私有屬性,2、沒有初始化的屬性)

現在我們要利用include讀取flag.txt,就肯定要調用invoke,就必須把這三個類聯系在一起,因為Show類里面有wakeup函數,include函數在modifier里面,肯定是最后一個看,因此我們要從Show類里面看起(先定義一下$a=new Show()):

public function __toString(){
        return $this->str->source;
    }
public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
            $this->source = "index.php";
        }

wakeup函數里面是一個正則表達式,目前對我們沒有多大用處,toString這個函數如果被調用了(目前不知道怎么調用這個函數就先跳過),會返回$this->str->source;這時我們想到,如果$this->str代表的是一個Test類呢

public function __get($key){
        $function = $this->p;
        return $function();
    }

因為Test類中沒有source這個屬性,因此會調用get方法,就這樣可以把Show和Test連接在一起,我們可以構造一個這個:$a->str=new Test();調用get方法后,很明顯是一個將$this->看成一個對象,用函數的方法調用,因此來引發invoke方法

public function append($value){
        include($value);
    }
public function __invoke(){
        $this->append($this->var);
    }

因此我們繼續構造:$a->str->p=new Modifier();這里需要用到var屬性,我們就可以將var賦值為php://filter/read=convert.base64-encode/resource=flag.php,因為這里沒有過濾,就可以放心用。

現在問題就是怎么開始調用toString()這個函數,看了別人的wp說可以再實例化一次,$b=new Show($a);因為Show里面的construct函數是$file='index.php'參數,如果不傳參的話就會使默認值,當我們把$a這個對象傳入后,this->source=$a,然后遇到正則表達式,因為正則表達式是對字符串進行過濾嘛,因此$a被當作了字符串,因此引發了toString這個函數。

最終我們的構造是 

Ezpop?pop序列化鏈反序列化實例分析

這里有點煩的就是由protect屬性,要加%00*%00,這里我學了一個小技巧,我們可以給他進一步url編碼,可以無視那些不可見字符,urlencode()

Ezpop?pop序列化鏈反序列化實例分析

將編碼后的傳入pop參數

Ezpop?pop序列化鏈反序列化實例分析

Ezpop?pop序列化鏈反序列化實例分析

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

向AI問一下細節

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

pop
AI

望城县| 临颍县| 镇巴县| 福鼎市| 淅川县| 山东省| 广平县| 布尔津县| 冕宁县| 寿宁县| 吉木萨尔县| 阿拉善盟| 洛川县| 义乌市| 惠水县| 天镇县| 长葛市| 辛集市| 邹城市| 花莲市| 讷河市| 凉城县| 庐江县| 泰州市| 淅川县| 衢州市| 视频| 黔东| 芒康县| 黎平县| 蕉岭县| 怀化市| 海安县| 南京市| 紫云| 南岸区| 霞浦县| 昌黎县| 莱阳市| 黄大仙区| 美姑县|