[GXYCTF2019]Ping Ping Ping1:命令注入的绕过

0x01前置知识
什么是IFS?
IFS是Internal Field Separator(内部字段分隔符),linux系统默认为空格,制表符,换行符。
$IFS可以作为空格的绕过方法。
什么是$1
空变量,和$IFS结合就是一个空格。(为什么要结合?因为如果只写$IFS,如果后面是index.php,就成了$IFSindex.php,linux系统以为我们要访问的文件是IFSindex.php,$1
就是用来切割二者的关系的)

shell_exec ()
就是linux命令的后门,输入直接当命令执行。

0x02解题流程
image
先来看看靶场:
image
结合题目中的ping,这里让我们输入ip,显然就是ping类型题目,我们先ping一下本机(默认为127.0.0.1)试试:
image
不错,这就是标准的ping功能。我们现在就直接命令注入试试:
image
直接就发现flag了,我们尝试直接cat一下flag.
image
image
都失败了,但是还有个index文件,我们cat一下它试试:
image
还是失败。此时我们推测,我们的命令的关键字符被过滤掉了,我们要考虑绕过。
最常见的是空格过滤,他的绕过有多种实现方式,但是最保险的是$IFS$1,而${IFS}可能大括号被过滤掉。
我们试一下拿他解index:
image
成功访问,我们可以看到,过滤很猛的,第一层上来就把各种注入符号干没了;
第二层专攻空格(ls不涉及空格所以可以注入,别的命令注入大多都要写空格);
第三层则针对Bash命令,全部被过滤掉了;
是不是用空格绕过就可以访问flag了?no,第四层奔着你的flag来的,只要出现flag,直接过滤掉,你就是用a=fl,b=ag;cat$IFS$1$a$b也没用,,也能识别出来flag.
但是我们注意最下面有个shell_exec ()给了a,这就是一个线索--我们可以通过定义变量来拼接flag。
正确的做法是只把后面的字符替换掉,只写一个替换,不然容易出问题。
image
狡兔三窟,最后访问了还要藏在HTML注释里,不过我之前强调过这个地方,应该不难找的。
image
可以这么写,但是可能大家有疑问,什么原理呢?就是如果直接写flag,会直接过滤,但是如果部分字符被代替,系统看不到完整的flag,就放过去了。

0x03思路总结
本题考查ping命令注入,但与以往不同的是许多命令字符被过滤掉了,因此我们选择合适的绕过方法来进行绕过。
通过本题,我们学习并运用了$IFS,$1实现空格绕过。

posted on 2026-03-24 12:04  richu  阅读(8)  评论(0)    收藏  举报