본문 바로가기

드림핵

[드림핵 워게임] [wargame.kr] strcmp

<문제>

 

<풀이>

문제 사이트에 접속하면 처음으로 볼 수 있는 페이지이다.

password를 입력하는 폼을 확인할 수 있다.

view-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..";
        }
    }

?>

사용자의 입력값을 POST 메소드로 받아서 입력값을 $password와 strcmp()함수로 비교한다.

strcmp()의 결과가 0이면 FLAG를 출력한다.

 

$password는 랜덤으로 생성하고 암호화하므로 그 값을 알아낼 수 없다.

문제에서도 말하고 있는 것처럼 strcmp 함수를 우회하는 방법으로 풀어야 한다.

 

php strcmp bypass를 검색해서

strcmp()는 배열과 문자열을 비교하면 0을 반환하는 것을 알게 되었다.

 

Burp Suite를 실행해서 브라우저를 열고

password 값을 전달하는 패킷을 intercept했다.

 

password뒤에 []를 추가해서 배열 객체로 수정했다.

 

변조된 요청을 보내니 FLAG가 출력되었다.