wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 md5_compare 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번에는 생각해보면 간단한 문제이면서, 생각만으로는 어려운 문제입니다.

즉, 어려운 이유는 기존에 알려진 취약점을 알아야 하기 때문입니다.


그래도 만약 md5에 대한 취약점을 안다면, 큰 어려움은 없으니 풀어보도록 합시다.



 

 문제 이해


문제는 다음과 같습니다.


위의 문제에서는 단순히 값을 비교를 한다고 합니다.


문제로 들어가 소스를 확인해보았습니다.

<?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...";
        }
    }
?>
<br />
<form method="GET">
    VALUE 1 : <input type="text" name="v1" /><br />
    VALUE 2 : <input type="text" name="v2" /><br />
    <input type="submit" value="chk" />
</form>
<br />
<a href="?view-source">view-source</a>


14, 15번 라인을 보게되면, 문자인지 숫자인지 확인합니다.


14번 라인은 문자열이면 참을 반환하는 ctype_alpha() 함수를 이용하여 문자열인지 비교하고, 

15번 라인은 숫자값이면 참을 반환하는 is_numeric() 함수를 이용하여 숫자값인지 비교합니다.


그리고 문자열과 숫자값이 적절하게 들어간 두 값을 각각 md5() 함수로 암호화를하여 비교합니다.

만약 비교가 정상적이라면 Flag를 토해냅니다.


이제 문제를 풀어보도록 합시다.




 

 문제 풀이


일단 이번 문제를 풀기 앞서 md5의 취약점을 보도록 합시다.


 

 md5 취약점(md5에서 나타날 수 있는 취약점)


PHP의 md5함수는 다음과 같은 취약점을 가지고 있습니다.


만약 md5 함수를 이용하여 나온 해쉬값이 0e로 시작하여 뒤의 값이 모두 숫자인 경우, 다음과 같은 결과값으로 바뀌게 됩니다.


0e462097431906509019562988736854 ==> 0.0 ==> 0


이렇게 되면 숫자 0으로 인식하게 됩니다.


이러한 해쉬를 매직해쉬라고도 하는데, md5는 잘 알려진 매직해쉬가 2개가 있습니다.


문자열로만 이루어진 매직해쉬 : QNKCDZO

숫자로만 이루어진 매직해쉬 : 240610708


이 두 값을 비교하여 검사를 해보면 다음과 같습니다.

그렇다면 이제 이 값들을 이용하여 문제를 풀어보도록 합시다.


앙!




+ Recent posts