最近在学反序列化,找几个简单的链跟一下,水一水博客
全局搜索unserialize
,在install.php
中
1 |
|
跟进Typecho_Cookie::get
,可以得到参数传递的方法为COOKIE或POST
1 | public static function get($key, $default = NULL) |
传入的参数可控了,接下来就是寻找参数的传递过程中有什么危险函数,跟进Typecho_Db
,发现传入的参数拼接了字符串
1 | $adapterName = 'Typecho_Db_Adapter_' . $adapterName; |
那么如果传入的是一个对象时,就会调用对象的__toString
方法,全局搜索一下,在 Query.php Common.php Pdo.php Feed.php中都存在,逐个去看一看, Query.php
中的是数据库的一些操作;Config.php
中的是一个序列化 ,都没什么用,Feed.php中有一个foreach对$_items
进行遍历输出,而$_items
我们可控,里边有一行如下
1 | $content .= '<dc:creator>' . htmlspecialchars($item['author']->screenName) . '</dc:creator>' . self::EOL; |
可以知道,如果$item['author']
是一个对象,而screenName
不存在的话,就回去调用对象的__get()
方法,接着去全局搜索,依次跟进,最后在Request.php中发现了东西
1 | public function get($key, $default = NULL) |
跟进_applyFilter
,发现调用了 call_user_func
危险函数,并且两个参数都是类中的属性,所以可控
1 | private function _applyFilter($value) |
分析至此,就可以构造payload了,如下
1 |
|
###