다음은 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"
가 출력됩니다.