第十八届全国大学生信息安全竞赛暨第二届长城杯初赛hello_web题解
题解
题目名称为:hello_web 访问界面如下:
在 URL 传入的 file 参数可以猜测出可能考察的是文件包含,同时页面存在 base64 编码,进行解码,内容如下:
1 | echo -n SSd2ZSBsZXQgeW91IGlnbm9yZSB0aGlzIHBhcmFncmFwaC4= |base64 -d |
即 “我让你忽略这一段”
接着查看页面源代码:
提示两个文件,让那个是进行包含:
发现显示之后就进行了 302 跳转,于是使用 burpsuite 进行抓包查看:
发现什么都没有,接着查看第二个文件:
发现提示依旧,这里我们访问主页,即包含的 hello.php 文件:
发现存在提示,不过进行了 HTML 实体编码,我们进行解码:
发现为 include.php
,我们直接访问查看:
发现提示 404,尝试在 index.php
中使用文件包含伪协议:
php://input
和 data://
、file://
、http://
都不可以,但是可以使用 zip://
和 phar://
发现可以使用,但是该题目并没有上传文件的入口,故而无法使用。
尝试包含 /etc/passwd
文件,但是题目肯定没有那么简单:
发现没有任何响应,最终我们直接访问 hackme.php
和 tips.php
:
发现和通过 ?file=../tips.php
以及 ?file=../hackme.php
和直接访问文件的结果一致,那么就证明,../
并没有起到作用。
那么这里尝了双写绕过:
发现了 phpinfo 页面,接着使用相同的方法访问 hackme.php
:
发现为 php 代码,我们直接在页面访问,源码如下:
1 |
|
通过对内容进行变量 $lapUCm
进行url解码为 n1zb/ma5\vt0i28-pxuqy*6lrkdg9_ehcswo4+f37j
通过全局内容进行查看,疑似 PHP 混淆加密。
这里参阅了文章: https://forum.butian.net/share/1476
对混淆代码进行解密,其实就是将代码中的 eval
换成了 echo
,输出源码如下:
将输出的内容替换到源代码中的整条 eval
语句:
接着将 eval
换成 echo
进行输出,最终输出的代码,则为实际的 PHP 代码:
发现为 一句话木马,但是由于存在小数点,不能直接连接:
我们本地测试一下:
1 |
|
这里可以发现,由于参数中带有小数点,当我们传参 cmd_66.99
时,实际上传入的是 cmd_66_99
也就是将特殊字符转为了 _
处理,但是代码中接收的是 cmd_66.99
,导致无法正常执行,需要进行绕过,结合前面出现的 phpinfo
页面,可以基本得知,这里可能考的是 PHP 特性。
于是进行了一顿查找,最终在如下文章中找到答案:
https://blog.csdn.net/mochu7777777/article/details/115050295
最终我们只需要将 cmd_66.99
改为 cmd[66.99
即可,即可正常执行命令。
这里我还特意使用了 phpinfo()
页面进行测试:
发现确实接收的参数为 cmd_66.99
,于是配合文件包含进行利用一句话木马即可:
发现成功利用代码,后续我们要获取 FLAG,尝试执行命令执行函数,发现执行失败,猜测有函数禁用。
发现禁用了一系列函数,但是没有禁用文件读取相关的函数,于是我们尝试读取文件:
发现执行失败,尝试读取当前页面的 index.php
【因为我猜测可能有open_basedir 限制】:
发现成功读取,因此可能存在 open_basedir
接着去 phpinfo 页面证实:
发现只允许读取 /proc
、/tmp
、/var/www/html
的内容,由于无法执行系统命令,那么我们通过 glob 协议列出目录:
参考文章:https://xz.aliyun.com/t/10070
PAYLOAD 如下:
1 | cmd[66.99=$a = new DirectoryIterator("glob:///*"); |
但是这里并没有 FLAG,当时还尝试读取网站根目录下内容,发现也无相关的 FLAG:
1 | cmd[66.99=$a = new DirectoryIterator("glob:///var/www/html/*"); |
后来,发现可以直接使用蚁剑进行列出目录…
进行了一顿文件查找,发现没有 flag 相关的,于是决定执行 find
命令查找:
由于函数禁用,无法执行命令。
这里尝试了很多方法,均无法使用,最终使用了 UAF
成功执行命令
一些思考
9点开始比赛,在10点30获取了权限,由于无法执行系统命令,在找 FLAG 浪费了一点时间。最后提交 FLAG 时,就有 29 个队伍解出(本来可以再早一点提交)。
如果自己平时多刷一点 web 类型的题目,应该很快将题目解出吧,每次参加这个比赛都会有新的收获!所以对 CTF 还缺乏比赛经验和平时学习。