문제 설명

strcmp 함수를 우회할 수 있다면, 플래그가 표시됩니다.


 

서버 생성 후 접속. 

<?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>

페이지의 view-source 누르면 이렇게 소스코드를 보여 준다. 

문제 설명에서 strcmp 함수를 우회하라고 했으니까 strcmp가 있는 라인을 주의 깊게 봤다. 

 

	if (strcmp($_POST['password'], $password) == 0) {
            echo "Congratulations! Flag is <b>" . $FLAG ."</b>";

여기 코드에서도, strcmp를 사용해 입력받은 password와,

코드 시작부에서 지정하고 있는 패스워드 값 ($password = sha1(md5(rand().rand().rand()).rand()); 을 통해 랜덤 숫자로 해시화된 비밀번호)를 비교하여 두 문자열이 일치할 시 플래그를 나타낸다는 것을 알 수 있다.

 

코드 자체는 엄청 간단하다.

다만 패스워드가 임의 생성되는 거라 내가 단순히 서버에 password 입력해서 풀 수 있는 건 아님...

랜덤 난수를 버퍼 스위트 같은 걸로 입력해도 한나절 걸릴 듯

정말 코드 속 취약점을 이용해서 풀이해야 한다. 

 

일단 strcmp 함수는 매개변수로 들어온 두 개의 문자열을 비교하여 문자열이 완전히 일치하면 0을 반환하는 함수이다.

그리고 문자열 두 개가 아니라, 문자열과 배열을 비교하면 두 값이 같지 않더라도 0을 출력하게 된다.

소스코드에서 내가 입력하는 password를 배열 형식의 password[]로 변경해 주면 문제가 해결될 것 같다!

이렇게 수정하여 name을 배열로 만들어 버렸다. 

 

 

password 입력 칸에 임의로 '123'을 입력해 본다. 

문제 해결 완료~

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[wargame.kr] type confusion (web)  (2) 2024.10.01
[wargame.kr] tmitter (web)  (0) 2024.09.24
[Dreamhack] Broken Password (misc)  (0) 2024.08.27
[Dreamhack] rev-basic-0 (reversing)  (0) 2024.08.27
[Dreamhack] file-special-bit (misc)  (0) 2024.08.20

+ Recent posts