pop链以及phar协议
打开页面,发现是一个查看文件和上传文件的页面,开始以为是文件上传漏洞,发现有后缀名好像有过滤,所以我们再观察查看文件页面,发现一个可疑点
1 | file.php?file= |
可以推测可能是文件包含,所以构造
1 | file.php?file=file.php |
读取file.php文件
1 | <?php |
源码中有两个文件,分别是class.php和function.php文件,所以我们通过构造
1 | file.php?file=class.php //读取class.php文件 |
function.php
1 | <?php |
从源码中可知
1 | $allowed_types = array("gif","jpeg","jpg","png"); |
上传文件后缀必须是以上几个
1 | if(file_exists("upload/" . $filename)) { |
上传文件可以在
1 | /upload |
目录下看到
class.php
1 | <?php |
通过观察源码,我们可以知道可以通过file_get_contents()函数来读取文件的内容,其中class.php中涉及几个魔术方法
1 | __get()魔术方法:从不可访问的属性读取数据会触发 |
pop链的思路
1 | 1. 要调用file_get()方法要调用get()方法 |
所以可以写exp
1 | <?php |
但是要打包成phar文件,所以exp
1 | <?php |
然后用php运行得到exp.phar文件,然后抓包,并将文件后缀改为jpg,然后上传,然后在
1 | /upload |
可以看见上传文件,然后由于file.php文件中
1 | if(file_exists($file)) { |
和class.php文件中的
1 | public function _show() |
可知文件内容可以使用highlight_file()函数显示,所以我们可以构造
1 | file.php?file=phar://upload/b78e1e4af578d40825462627147a5573.jpg |
来触发phar文件,进行反序列化,读取flag,但是最后结果需要经过base64解密