본문 바로가기

보안공부/Wargame.kr 풀이

wargame.kr md5_compare 풀이

오늘은 md5_compare문제를 풀어보려고 한다.

 

문제에 들어가니 다음과 같은 폼이 기다리고 있다.

 

view-source라고 되어있는 링크를 눌러 코드를 분석해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
    if (isset($_GET['view-source'])) {
         show_source(__FILE__);
         exit();
    }
 
    if (isset($_GET['v1']) && isset($_GET['v2'])) {
        sleep(3); // anti brute force
 
        $chk = true;
        $v1 = $_GET['v1'];
        $v2 = $_GET['v2'];
 
        if (!ctype_alpha($v1)) {$chk = false;}
        if (!is_numeric($v2) ) {$chk = false;}
        if (md5($v1!= md5($v2)) {$chk = false;}
 
        if ($chk){
            include("../lib.php");
            echo "Congratulations! FLAG is : ".auth_code("md5_compare");
        } else {
            echo "Wrong...";
        }
    }
?>
cs

 

 

ctype_alpha는 값이 모두 알파벳일떄 true를 리턴해주는 함수이고, is_numeric은 값이 숫자일때 true를 리턴해주는 함수이다.

 

따라서 우리는 VALUE 1에는 알파벳을, VALUE 2에는 숫자를 입력해주어야 하고, 그 두 값의 md5의 해시가 같아야 플래그가 나온다는 사실을 알 수 있다.

 

md5 해시를 어떻게 같게할 수 있을까? 불가능하다.

 

그런데 여기서 잠깐, 위의 코드에는 자료형을 확인하지 않고 md5 해시만을 비교한다. 따라서 magic hash를 사용할 수 있다는 사실을 알 수 있다.

 

아래의 두 해시가 0e 와 정수로 시작하여 두 값 모두 string이지만 ==로 비교할 경우에는 자료형을 따로 비교하지 않 float로 비교되기 때문에 두 해쉬 모두 0이라 간주되어 비교된다.

  • 240610708 : 0e462097431906509019562988736854
  • QNKCDZO : 0e830400451993494058024219903391

따라서 코드상에서 두 md5 해시값이 같다고 확인되기 때문에 플래그가 출력되게 된다.

 

이 때 우리는 VALUE 1와 VALUE 2를 알게 된 셈이다.

 

위처럼 입력하고 chk를 눌러주면 플래그가 나오며 풀리게 된다.