源代码:
<?php
highlight_file(__FILE__);
class a{
public $un0;
public $un1;
public $un2;
public $un3;
public $un4;
public function __destruct(){
if(!empty($this->un0) && empty($this->un2)){
$this -> Givemeanew();
if($this -> un3 === 'unserialize'){
$this -> yigei();
}
else{
$this -> giao();
}
}
}
public function Givemeanew(){
$this -> un4 = new $this->un0($this -> un1);
}
public function yigei(){
echo 'Your output: '.$this->un4;
}
public function giao(){
@eval($this->un2);
}
public function __wakeup(){
include $this -> un2.'hint.php';
}
}
$data = $_POST['data'];
unserialize($data);
可以看到
就可以把un0定义为一个类,然后un1是参数;
使用原生类读取和打开文件的操作:参考博文: PHP之序列化与反序列化(原生类应用篇上)_errorr0的博客-CSDN博客_php原生类反序列化
这里提到三个遍历文件目录原生类:
DirectoryIterator
FilesystemIterator
GlobIterator
具体操作看参考;
这里就构造
un0="DirectoryIterator"
un1="glob:\\f*" 这里的f*指的是以f开头的文件;
un3 === 'unserialize';
反序列化打开给出的文件就是flag