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