WHU文件上传
知识点
用伪协议读源代码、phar 反序列化

题目打开就是这样的,首先猜测是上传,然后我一开始上传了jpg png 图片,都说存在危险代码。有点懵逼,然后试了一下gif,但又说文件太大了,所以到这里,估计是对文件内容和大小都进行了过滤。于是自己用winhex伪造了一个.gif文件,发现上传成功。
然后来到view.php:

然后我访问了一下这个文件上传的目录:

尝试了一下,没有可以利用的地方。然后进行到这一步,就有点没头绪了。
后来因为前几天刚做了一个文件上传的题目,是利用到phar反序列化的。但是就算是考察phar反序列化,没有源代码怎么构造呢?所以我的思路转到了如何读取upload.php和 view.php的源代码。然后就是进行抓包,找可利用的参数,最后找到acti0n:
但是给ban了,所以我更加笃定这里肯定存在利用点。想办法绕过去,这里我试了很久,最后试出来把base改为Base就可以绕过:
然后读到了upload.php和view.php的代码:


upload这里基本上就是一些过滤,白名单、文件类型、文件大小等,我们通过看到没有过滤.phar文件,可以更加笃定可以利用phar反序列化。不过这里就算过滤了.phar后缀 我们也可以利用 phar反序列化。
我们再来看看view.php的代码:



大致浏览一下,可以看到destruct()那里 可以执行eval(),所以这里是我们的利用点。
到这里基本上就没有难度了,只有一个构造函数、析构函数来利用,没有很长的pop链,直接就是一层关系。
但是注意upload.php那里,过滤了很多函数:

可以发现 system exec都给过滤了。但是我们的目的是读flag.php,所以这里我们用到 show_source()函数来显示flag.php的源代码
所以最终的构造:

然后我们上传生成的.phar文件:

发现成功上传,这里就到了最后一步,利用phar:// 协议来读取.phar文件,从而触发反序列化。我们注意到view.php存在这个代码:

然后看一下 delete_img()函数:

利用phar伪协议和这里的file_exists() 、 unlink() 都可以触发反序列化。
所以最后在delete参数这里利用phar伪协议来读:

到这里就结束了。