오늘은 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를 눌러주면 플래그가 나오며 풀리게 된다.
'보안공부 > Wargame.kr 풀이' 카테고리의 다른 글
wargame.kr strcmp 풀이 (0) | 2024.10.15 |
---|---|
wargame.kr tmitter 풀이 (4) | 2019.02.26 |
wargame.kr type confusion 풀이 - json (0) | 2018.08.03 |
wargame.kr WTF_CODE 풀이 - Space (0) | 2018.07.15 |
wargame.kr login filterling 풀이 - 대소문자 (0) | 2018.07.14 |