PHP特性:绕过匹配机制的下划线
<?php error_reporting(0); include("flag.php"); highlight_file(__FILE__); $ctf_show = md5($flag); $url = $_SERVER['QUERY_STRING']; //特殊字符检测 function waf($url){ if(preg_match('/\`|\~|\!|\@|\#|\^|\*|\(|\)|\\$|\_|\-|\+|\{|\;|\:|\[|\]|\}|\'|\"|\<|\,|\>|\.|\\\|\//', $url)){ return true; }else{ return false; } } if(waf($url)){ die("嗯哼?"); }else{ extract($_GET); } if($ctf_show==='ilove36d'){ echo $flag; } ?>
这么多代码无非就是在告诉我们:下划线你是输入不了的,无法获取变量ctf_show变量使得条件$ctf_show===’ilove36d’成立
这里先得介绍一下这个函数:
extract($_GET);
会发现GET方式中a被当做了变量 后面的等于号就是变量a的值
再结合GET或POST方式传进去的变量名,会自动将空格 + . [转换为_
这个特性,可以构造出最终的payload:
?ctf show=ilove36d