phpggc thinkphp FW2

 

FW2

影响范围:

  • thinkphp 5.0.0-5.0.3

使用

FW2 使用时需要提供两个参数,第一个参数用于指定写入的路径,第二个参数用于指定本地读取的文件。-b 参数用于将输出转为 base64。

phpggc ThinkPHP/FW2 /tmp/ /mnt/share/Tools/web/PHP/unserialize/phpggc/test/test.txt -b

分析

整个调用链如下所示:

think\Process::__destruct()                                
    | $this->close()                                       
    | $this->processPipes->close()                         
    think\model\Relation::__call()  <---- [diff]                       
        | $this->query->where()                                     
        think\console\Output::__call()                     
            | call_user_func_array([$this, 'block'], $args)
            | $this->block()                               
            | $this->handle->write()                       
            think\session\driver\Memcache::write()         
                | $this->handler->set()                    
                think\cache\driver\Memcached::set()<-+     
                    | $this->handler->set()          |     
                    think\cache\driver\File::set()   |     
                        | $this->setTagItem()        |     
                        | $this->set()               |     
                        file_put_contents() * <----  |     
                    | $this->setTagItem()            |     
                    | $this->set()-------------------+       

对比 FW2 与 FW1 的 gadget 可以发现两者大部分是一样的,但 FW1 中利用的是: think\model\relation\HasMany

    think\model\relation\HasMany::__call()                         
        | $this->baseQuery()                               
        | $this->query->where()        

而 FW2 中直接利用了think\model\Relation 类。

区别的原因在于 think\model\Relation 类 __call 中的内容发生了改变, 在 5.0.3 中 Relation 类可以直接调用 $this->query->where()

public function __call($method, $args)
{
    if ($this->query) {
        switch ($this->type) {
            case self::HAS_MANY:
                if (isset($this->where)) {
                    $this->query->where($this->where);

而在 5.0.23 中,Relation 的操作用几个子类来完成,$this->baseQuery 会调用子类的 baseQuery 方法,FW1 中利用的 think\model\relation\HasMany 就是 Relation 的子类。

public function __call($method, $args)
{
    if ($this->query) {
        // 执行基础查询
        $this->baseQuery();