안경잡이개발자

728x90
반응형

  md5_compare는 문제 이름에서부터 md5를 이용하여 두 개의 해시 값을 비교할 때의 취약점에 대해서 물어보는 것임을 알 수 있습니다.

 

 

  문제 풀이 페이지에 접속을 해보면 다음과 같이 [view-source] 버튼이 있고, 이를 눌러 PHP 소스코드를 확인할 수 있습니다.

 

 

  소스코드를 확인해 본 결과 총 3가지의 검증이 수행되는 것을 알 수 있습니다.

 

 

  ctype_alpha() 함수는 모두 알파벳으로 구성되어 있는지 확인합니다.

  is_numeric() 함수는 모두 숫자로 구성되어 있는지 확인합니다.

  md5() 함수는 말 그대로 MD5 해시 값을 구하는 함수입니다.

 

  다시 말해 알파벳으로만 구성된 문자열과 숫자로만 구성된 문자열의 MD5 해시값이 같은 경우를 찾으면 됩니다. 이러한 경우는 매우 흔치 않은 경우인데요. PHP의 취약점을 이용하면 쉽게 필터링을 우회할 수 있습니다. 사실 이러한 취약점에 대해서는 PHP 공식 매뉴얼에서 예시를 확인할 수 있습니다.

 

  PHP md5 매뉴얼 페이지: https://www.php.net/manual/en/function.md5.php

 

PHP: md5 - Manual

From the documentation on Digest::MD5:md5($data,...)This function will concatenate all arguments, calculate the MD5 digest of this "message", and return it in binary form.md5_hex($data,...)Same as md5(), but will return the digest in hexadecimal form. PHP'

www.php.net

 

  다음의 글을 보시면 '240610708'의 MD5 해시와 'QNKCDZO'의 MD5 해시를 단순히 == 연산자로 비교하는 경우 같다는 결과가 나온다고 합니다. 이는 PHP에서 == 연산자를 이용하는 경우 검증을 약하게 하기 때문이며, === 연산자를 이용하는 방식으로 보안을 강화할 수 있습니다.

 

 

  따라서 바로 한 번 입력 값을 대입하여 문제가 풀리는지 확인해보겠습니다.

 

 

  대입 결과 정상적으로 플래그(Flag) 값이 등장합니다.

 

 

 

728x90
반응형