2019极客巅峰ctf记录
周六抽时间做了2019极客巅峰的ctf,发现自己是真的菜,需要找个地方沉淀一下,所以将做出的题记录记录在博客
aweb_1
提示admin才能看到flag1
发现注册处用户名参数存在二次注入,有过滤,使用`name=admin’//and//‘3`绕过
注册成功,用户名:assssssssss@qq.com,密码:123456’,登录成功,成功获取到flag
upload
这道题线上没做出来,比赛结束后研究了一波,:(
打开题目,首页有三个模块,分别为
查看文件:file.php?file=
上传文件:upload_file.php
下载文件:download.php
下载文件页面泄露了部分的源代码,代码如下:
|
|
这里存在文件下载漏洞,但是存在过滤,暂时无法绕过
查看页面源代码发现hint:提示flag文件的位置位于/flag
回过头发现查看文件模块存在任意文件读取:/file.php?file=/etc/passwd
尝试直接读取flag文件。失败:
尝试读取download.php:/file.php?file=download.php
读取失败
修改为绝对路径/file.php?file=/var/www/html/download.php
,读取成功
完整源码如下:
|
|
其中可以利用$string = str_replace('\\','',$string);
进行文件下载绕过,绕过方法如下:
/download.php?name=ind\\ex
通过文件读取和文件下载结合获取源代码:
index.php
|
|
base.php
|
|
file.php
|
|
function.php
|
|
upload_file.php
|
|
class.php
|
|
代码审计后发现不能通过文件读取和文件下载直接获取flag,因为这里的过滤无法绕过
通过class.php代码猜测题目应该是考察的应该是php反序列化漏洞,但是并没有找到unserialize函数,不过发现file.php当中以下的代码可能存在phar反序列化漏洞的问题,php一些函数在使用phar伪协议解析phar文件时,会对phar文件当中的meta-data部分进行反序列化,其中file_exists
函数就是其中之一
所以这道题的正确思路是应该是通过phar反序列化获取flag,思路如下:
构造pop链,生成phar文件,上传->通过文件读取,使用phar伪协议解析上传的phar文件->触发file_exists函数,产生php反序列化漏洞->通过php反序列化获取flag
构造pop链,生成phar文件:poc如下:
|
|
触发过程:
sh0w对象反序列化时调用__destruct
,调用了S6ow对象的_show
方法,由于_show方法不存在,从而调用了__call
,此时$this->{$name}
的值变为了_show
,在进行$this->{$name}
判断时,由于_show
属性也不存在,从而触发了__get
方法,$this->{$name}
的值被赋为file_get
,从而调用了file_get
函数,由于一开始$this->file
的值被设为了Show对象,所以这里将Show对象输出,触发了Show对象的__ToString
方法,成功绕过了过滤读取flag
生成phar文件,将后缀重名名为.jpg上传至服务器,通过phar伪协议读取上传后的文件:/file.php?file=phar:///var/www/html/upload/4935ad2c4be6114f4bf09d55ed82a60b.jpg
base64解码后获取到flag
剩下的题目,等待writeup出来后学习