SWPUCTF 2018 simplephp
phar协议读.phar文件造成反序列化漏洞

打开是这样的,给了几个功能,一个是查文件的功能,一个是上传,一开始以为查文件这里会存在任意文件读取,结果不是,它只能读取部分文件,并且后来读到文件的代码才发现,并不是用的 include()函数,只是单纯的show()函数,让你看一下代码而已。
文件上传那里用的是白名单,对后缀进行了检测,只允许图片格式的后缀。
先通过查看文件那里,读到file.php的源代码:

可以看到这并不是文件包含,只是调用show()函数,我们用同样的方法去读 function.php 、class.php 文件的源代码:



可以看到有三个类,这里有wakeup 函数,让我不由自主的想到反序列化,但是却没有 unserialize()函数。但是之前见过 .phar文件也可以造成反序列化。
我们再来看看function.php的源代码:

对后缀进行了白名单过滤机制,但是这并不影响我们上传phar类型的文件,因为phar文件后缀改成图片格式也不会影响它的作用,它的作用是由

来决定的。
现在我们再回过头来看看class.php文件里面,有没有可能存在反序列化的利用点,需要找到pop链
pop链的找取是有一定逻辑的,因为我们的目标是触发那些魔法函数,我们就要想办法去找到符合触发它们的条件,最后找到落脚点是什么就好了(落脚点就是最后我们核心利用的点),比如这里就是

我们很自然的想到 最后要利用 file_get_contents() 来拿到flag.php文件的内容
所以我构造的pop链为:

然后再写代码生成一个.phar的文件:

然后访问这个php文件,本地生成一个.phar文件,后缀改成 .gif 上传 ,然后找到它的路径,这个题目直接把upload 文件夹开放了

可以很清晰的看到它的路径,这里其实通过function.php也可以推出来它的路径:

因为这里的格式是固定的,而且我们也可以知道服务器的IP,这里给了的:

拿到路径之后,接下来我们利用phar 协议来读 .phar 文件 从而触发 反序列化
可以看到 file.php 代码中存在:

phar 协议 对 file_exists 函数是存在影响的,所以我们这里 传参过去:

就可以读到 base64编码后的 flag.php文件,解码就可以拿到flag了。