본문 바로가기

Dreamhack/웹해킹

[LEVEL 1] [wargame.kr] strcmp

웹 서비스에 접속하면 단순한 로그인 폼과 같은 화면이 나타납니다. 비밀번호를 입력받는 입력창과 확인 버튼이 제공되며, 하단에는 view-source 링크가 존재합니다.

 

비밀번호 입력창에 임의의 값을 넣고 확인을 시도해본 결과, 잘못된 값을 입력하면 Wrong password라는 메시지가 출력되는 것을 확인할 수 있었습니다. 이를 통해 서버에서 입력값에 대한 검증 로직이 존재함을 알 수 있습니다.

 

view-source 링크를 통해 소스 코드를 확인해보면, 비밀번호 검증 로직이 어떻게 구현되어 있는지 알 수 있습니다.

 

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

?>
<br />
<br />
<form method="POST">
    password : <input type="text" name="password" /> <input type="submit" value="chk">
</form>
<br />
<a href="?view-source">view-source</a>
  1. lib.php 파일을 불러와 플래그 변수를 가져옵니다.
  2. $password는 sha1(md5(rand().rand().rand()).rand())로 매번 실행 시 난수 기반의 해시 값이 생성됩니다.
  3. 사용자가 POST 방식으로 입력한 비밀번호와 서버에서 생성된 $password 값을 strcmp()로 비교합니다.
  4. 값이 일치하면 플래그를 출력하고, 틀리면 Wrong password.. 메시지를 반환합니다.

코드상에서 strcmp()는 문자열 비교를 위해 사용되었지만, PHP 특성상 배열을 인자로 넣으면 NULL을 반환하게 됩니다. 이때 NULL == 0이 참으로 평가되면서, 실제 비밀번호 검증 과정을 거치지 않고 조건문을 우회할 수 있는 취약점이 발생합니다. 이 점이 문제를 해결할 수 있는 핵심 실마리입니다.

 

이제 실제로 취약점을 검증해보기 위해 curl을 이용해 요청을 보내보겠습니다.

비밀번호는 단일 값이 아닌 배열 형태(password[])로 전달해야 하므로, 다음과 같이 명령어를 작성합니다

curl -X POST -d "password[]=1" http://host1.dreamhack.games:17803/
  • password[] 형태로 전달되면 PHP에서는 문자열이 아니라 배열로 인식하게 됩니다.
  • strcmp($_POST['password'], $password) 호출 시, strcmp(Array, $password) 형태가 되어 NULL 반환 → NULL == 0 으로 조건이 참이 되어 플래그가 출력됩니다.

 

'Dreamhack > 웹해킹' 카테고리의 다른 글

[LEVEL 1] error based sql injection  (0) 2026.01.05
[LEVEL 1] type confusion  (0) 2025.09.11
[LEVEL 1] [wargame.kr] fly me to the moon  (0) 2025.09.08
[LEVEL 1] csrf-2  (1) 2025.09.08
[LEVEL 1] xss-2  (0) 2025.09.07