Wargame/Web

[Wargame.kr] strcmp

1ullaby 2024. 5. 11. 02:44

strcmp 함수를 우회해야 하는 문제인 것 같다.

 

 

 

문제 서버에 접속하니 패스워드를 입력하는 창이 하나 있었다.

먼저 소스코드를 확인해보았다. 

 

Source

<?php
    require("./lib.php"); // for FLAG

    $password = sha1(md5(rand().rand().rand()).rand());

    if (isset($_GET['view-source'])) {
        show_source(__FILE__);
        exit();
    }else if(isset($_POST['password'])){
        sleep(1); // do not brute force!
        if (strcmp($_POST['password'], $password) == 0) {
            echo "Congratulations! Flag is <b>" . $FLAG ."</b>";
            exit();
        } else {
            echo "Wrong password..";
        }
    }

- password는 완전 랜덤값

- password와 입력값 비교 → 반환값이 0이면(값이 같으면) 플래그 도출

- 브루트포스 불가

 

< strcmp() >

- strcmp(A, B) : A, B값이 같으면 0 반환

 

[취약점]

- 특정 PHP 버전에서는 '문자열'과 '배열'을 비교하면 같지 않아도 NULL을 반환

- 'NULL == 0' → '=='는 느슨한 비교이기 때문에 True

** NULL과 0 구분하려면 '===' 사용 

 

 

 

개발자도구를 이용해 name="password"를 배열로 바꿔준다.

name="password[]"

 

 

이후 password 창에 아무 값이나 넣어 보내면 Flag 획득이 가능하다.