wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.
이번 포스트에서는 md5_compare 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.
이번에는 생각해보면 간단한 문제이면서, 생각만으로는 어려운 문제입니다.
즉, 어려운 이유는 기존에 알려진 취약점을 알아야 하기 때문입니다.
그래도 만약 md5에 대한 취약점을 안다면, 큰 어려움은 없으니 풀어보도록 합시다.
|
문제 이해 |
위의 문제에서는 단순히 값을 비교를 한다고 합니다.
문제로 들어가 소스를 확인해보았습니다.
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 26 27 28 29 30 31 32 33 |
<?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
이 두 값을 비교하여 검사를 해보면 다음과 같습니다.
그렇다면 이제 이 값들을 이용하여 문제를 풀어보도록 합시다.
앙!
'WARGAMES > wargame.kr' 카테고리의 다른 글
[Wargame.kr] Level 14 - php? c? (0) | 2019.05.15 |
---|---|
[Wargame.kr] Level 13 - img recovery (2) | 2019.05.01 |
[Wargame.kr] Level 12 - type_confusion (0) | 2019.04.30 |
[Wargame.kr] Level 11 - tmitter (0) | 2019.04.30 |
[Wargame.kr] Level 09 - strcmp (0) | 2019.04.10 |
[Wargame.kr] Level 08 - db_is_really_good (0) | 2019.04.09 |
[Wargame.kr] Level 07 - md5_password (0) | 2019.04.09 |
[Wargame.kr] Level 06 - fly_to_the_moon (0) | 2019.04.09 |