Typcho反序列化漏洞分析

本文详细剖析了Typecho早期版本的反序列化漏洞,涉及Cookie、Db类和Feed类中的魔术方法调用,展示了如何通过构造特定POC利用__toString与__get方法实现远程代码执行。

Typcho反序列化漏洞分析

文章首发:https://xz.aliyun.com/t/9428

影响范围:

2017年10月24日之前的所有版本

环境搭建:

下载地址:http://typecho.org/,这里主要是说下,在intall之前,需要我们手动去数据库添加Typecho数据库

我之前去官网下载的0.9的版本,结果复现失败,想下载之前的版本,官网也没有了,这里找到了1.0.14版本

链接:https://pan.baidu.com/s/1Cc7qJfGSwVop9L1X4pC67Q 提取码:fwvp

漏洞分析:

漏洞入口:install.php246行

<?php
	$config = unserialize(base64_decode(Typecho_Cookie::get('__typecho_config')));
	$type = explode('_', $config['adapter']);
	$type = array_pop($type);

	try {
   
   
		$installDb = new Typecho_Db($config['adapter'], $config['prefix']);
		$installDb->addServer($config, Typecho_Db::READ | Typecho_Db::WRITE);
    	}   
?>

明显的一个反序列化函数,但是如何利用呢,反序列化能够利用的点必须要有相应的魔术方法配合。其中比较关键的有这几个。

__destruct()
__wakeup()
__toString()
__call()
__get()

其中__destruct()是在对象被销毁的时候自动调用,__Wakeup在反序列化的时候自动调用,__toString()是在调用对象当作字符串的时候自动调用。__call()是在对象调用的方法不存在的时候自动调用。__get()是在读取不可访问的属性的值的时候自动调用

先查看Typecho_Cookie类中的get()函数吧:存在于Cookie.php

在这里插入图片描述

这里的key即是__typecho_config,我们可以通过COOKIE或者POST传参并返回成为configinstall.php又存在这个代码:

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

说明Typecho_Db类的参数我们可控,回溯Typecho_Db类:存在于Db.php

在这里插入图片描述

这里的adapterName就是我们可控的config,发现这里对adapterName进行了字符替换,那当它为一个类的时候,那么就会自动调用__toString()方法

所以这里如果构造的反序列化是一个数组,其中adapter设置为某个类,就可以触发相应类的__toString方法

全局搜索toString

Typecho/var/Typecho/Feed.php可以利用:

在这里插入图片描述

顺着分析__tostring()函数

290行 调用了$item['author']->screenName$items这是一个当前类的私有变量,$item又是由$items遍历而来,所以可控

在这里插入图片描述

这里的item['author']调用了sceenName方法,若item['author']为一个类时,而且不存在sceenName方法时,就会调用__get魔术方法,所以全局搜索__get魔术方法。

/var/Typecho/Request.php发现可以利用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值