wargame.kr - 10 (md5_compare)
열번째 문제다.
JUST COMPARE ONLY.
with the oher value :D
Start 버튼을 눌러 문제를 확인하자.
VALUE 1, VALUE 2에 대한 입력 폼이 있고 chk 버튼이 존재한다.
하단에는 view-source 를 눌러 소스코드를 확인할 수 있는데 다음과 같다.
VALUE 1 에 입력되는 값은 GET 메소드를 통해 $v1 변수에 들어가고
변수가 알파벳으로만 이루어져있는 경우 True를 반환하는 ctype_alpha 함수를 이용해
알파벳이 아닐경우 Wrong... 이 출력된다.
VALUE 2 또한 입력되는 값은 GET 메소드를 통해 $v2 변수에 들어가고
변수가 숫자로만 이루어져있는 경우 True를 반환하는 is_numeric 함수를 이용해
숫자가 아닐경우 Wrong... 이 출력되게 하고 있다.
그리고 $v1 값과 $v2 값의 MD5 값이 다를경우 또한 Wrong이 출력된다.
결국 코드를 분석해보면 알파벳으로만 이루어진 문자열과 숫자로만 이루어진 문자열의
MD5 해시값이 충돌되는 문자열을 찾아야하는데
이는 구글링을 통해 찾았다
MD5 해쉬함수에 대한 Magic Hash 취약점이라는것을 찾을 수 있었는데
해쉬값을 비교하는것이 ===(엄격한 비교)가 아닌 ==(느슨한 비교)일 경우,
0e로 시작하는 해쉬값은 0으로 인식한다고 한다
md5('QNKCDZO')결과는 0e830400451993494058024219903391 → 0
md5('240610708')결과는 0e462097431906509019562988736854 → 0
각각 MD5 해쉬값이 다르지만 ==(느슨한 비교)일 경우 md5(240610708) == md5('QNKCDZO)는 참이된다.