Web 50 – 마법에 걸린 것 같아 Source code

이 문제는 PHP == 비교 연산자의 느슨함을 이용한 md5 Magic Hash 문제다.

다양한 자료형 비교 (출처 php.net)

PHP에서의 == 비교는 서로의 형식이 다를때 위 사진과 같이 자동으로 형 변환을 거친 후 비교를 한다. 예를 들어 문자열 “abc”와 true를 비교하면 결과는 true가 나오게 된다.

“abc” == true의 결과값

보다시피 php의 == 연산자는 느슨한 비교로 인해 취약점이 생기기 좋게 보인다.

md5("240610708")의 결과는 0e462097431906509019562988736854다. 여기서 잠깐 짚고 넘어가자면 PHP에서 <숫자>e<숫자>는 거듭제곱을 의미한다. 0e<숫자>는 0에다가 제곱을 하는 것이기 때문에 결과는 무조건 0이 될 수 밖에 없고 0e<숫자> 형식으로 된 md5("240610708")는 결과값이 0이 된다. 이런 해쉬 값을 Magic Hash라고 한다.

우선 key 입력에 240610708을 입력하는 것은 이미 막혀있기 때문에 안되고, 다른 Magic Hash를 찾아야 한다. 이 부분은 우리의 친구 구글에게 물어보면 친절하게 알려준다.

저 링크를 타고 들어가보면 또 다른 문자열인 QNKCDZO도 md5 해쉬 값이 0e<숫자> 형태로 되어있는 Magic Hash인 것을 알 수 있다. 문제로 돌아와서 key에다가 QNKCDZO를 넣으면 조건문을 충족하게 되어 플래그가 나온다.

Success! Flag is h4ctf{m4gic_h4sh_is_be4utiful!}