[Tutorial] lirilli larila magic

@yd1ng· May 19, 2025 · 1 min read

다음은 PHP md5 해시 충돌 우회를 이용한 웹 해킹 문제입니다.

if ($num1 == $num2) {
    exit("They must not match.");
}

if (md5($num1) == md5($num2)) {
    echo "Hello! Magic $flag";
}

조건

  • $num1 != $num2
  • md5($num1) == md5($num2)

PHP의 타입 변환(type juggling)을 이용한 우회

PHP에서 문자열 해시값이 '0e...'와 같은 숫자 형식일 경우, == 연산은 문자열이 아닌 숫자 비교로 처리됩니다.

md5('240610708') => '0e462097431906509019562988736854'
md5('QNKCDZO')    => '0e830400451993494058024219903391'

위 두 값은 문자열로 보면 다르지만, PHP는 둘 다 0e+숫자 → 숫자 0으로 인식하여 비교 결과는 true입니다.


최종 입력값

$num1 = '240610708';
$num2 = 'QNKCDZO';
  • $num1 != $num2 → 조건 1 충족
  • md5($num1) == md5($num2) → 조건 2 충족

따라서 "Hello! Magic $flag" 가 출력됩니다.

@yd1ng
안녕하세요. 양진영입니다.
© copyright 2025. yd1ng all rights reserved.