首页 > Web开发 > 详细

thinkphp5.1.X反序列化利用链审计

时间:2020-04-05 23:38:37      阅读:190      评论:0      收藏:0      [点我收藏+]

0x00 前言

反序列化基础知识:

https://www.cnblogs.com/wangtanzhi/p/12252993.html

https://www.cnblogs.com/wangtanzhi/p/12637819.html

0x01

compose安装tp框架

先记录一下看了一晚上的pop利用链,明天继续审

技术分享图片

整个漏洞起点:

\thinkphp\library\think\process\pipes\windows.php的__destruct魔法函数。

public function __destruct()
{
	$this->close();
	$this->removeFiles();
}

在此页面搜索removeFiles()

private function removeFiles()
{
    foreach ($this->files as $filename) {
        if (file_exists($filename)) {
            @unlink($filename);
        }
    }
    $this->files = [];
}

可以看到有一个unlink函数,如果我们能够控制$filename,就可以达到任意文件删除。
自然而然,我们开始看file_exists这个函数,
技术分享图片

$filename会被作为字符串处理。

而__toString?当一个对象在反序列化后被当做字符串使用时会被触发,我们通过传入一个对象来触发__toString?方法。搜索__toString方法。因为前面我们传入的是一个Pivot对象,所以此时便会触发__toString方法。
全局搜索__toString

这里有很多地方用到,我们跟进\thinkphp\library\think\model\concern\Conversion.php的Conversion类的__toString()方法,这里调用了一个toJson()方法。然后跟进toJson()方法。
技术分享图片

这里调用了toArray()方法,然后转换为json字符串,继续跟进toArray()。
\thinkphp\library\think\model\concern\Conversion.php中
技术分享图片

分析一下前面三个遍历基本上不会干扰到我们整个利用链
我们直接看对$this->append的遍历:

 // 追加属性(必须定义获取器)
        if (!empty($this->append)) {
            foreach ($this->append as $key => $name) {
                if (is_array($name)) {
                    // 追加关联对象属性
                    $relation = $this->getRelation($key);

                    if (!$relation) {
                        $relation = $this->getAttr($key);
                        if ($relation) {
                            $relation->visible($name);
                        }
                    }

我们需要在toArray()函数中寻找一个满足$可控变量->方法(参数可控)的点

这里的$this->append是我们可控的
这个方法中的值怎么来的?分析代码继续跟进。

thinkphp5.1.X反序列化利用链审计

原文:https://www.cnblogs.com/wangtanzhi/p/12639659.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!