1. 문제분석 & 풀이
먼저 제목과 힌트를 확인해보니 compare 관련 문제라는 것을 알 수 있다.
문제에 접속하니 value 1, value 2 를 입력할 수 있고 소스가 주어져있다.
소스를 확인해서 분석해보자.
1. sleep(3)으로 부르트 포스를 방지한다. (8번줄)
2. value 1을 $v1에 value 2를 $v2에 넣는다. (11,,12번줄)
3. $v1 값의 모든 값이 알파벳인지 확인하고 하나라도 맞으면 통과. (14번줄)
4. $v2 값의 모든 값이 숫자인지 확인하고 하나라도 맞으면 통과. (15번줄)
5. 3,4번의 조건을 만족하여 통과하고 $v1, $v2를 각각 md5 해싱한 결과값이 같으면 flag값을 획득한다. (16~20번줄)
결론적으로 요약하자면 다음과 같다.
value 1은 알파벳으로만 구성된 값, value 2는 숫자로만 구성된 값을 넣어야하며 이렇게 넣은 두 값을 각각 md5 해싱했을때 결과값이 같으면 문제가 해결된다.
그러나 문제는 value 1, value 2에 들어가는 입력값이 무조건 다르기 때문에 결과값을 같게 만드는 것은 쉽지 않을 것 같다.
힌트와 제목에 언급된 것을 보면 md5, compare 가 언급이 되었고 md5 관련된 취약점들을 찾아봤다.
찾아보니 md5 취약점 중 매직해쉬라는 취약점을 발견할 수 있었다.
1) 매직해쉬란?
type juggling을 이용하여 서로 다른 값을 같은 값으로 인식하게 하는 동작이다.
여기서 말하는 type juggling은 php에서 변수의 타입을 자동으로 설정해주는 것을 말한다.
php에서 0e로 시작하고 뒤가 모두 숫자인 변수의 경우 지수타입으로 취급하고 type juggling을 통해 변수가 float 타입으로 바뀌게 된다.
이때, float 타입으로 바뀌면 0*10 ^ 숫자 의 형태가 되어 연산 결과값이 0이 된다.
즉, 0e[숫자] 형태의 결과값을 만들 수 있다면 그 값은 type juggling을 통해 0으로 만들 수 있고 이를 이용해서 비교할 두 개의 값을 똑같은 값으로 만들 수 있다.
문제로 돌아와서 value 1 과 value 2의 입력값이 달라도 위에 설명한 매직해쉬 취약점을 이용해서 문제를 해결할 수 있을 것 같다.
공격 시나리오를 작성하면 다음과 같다.
1. md5 해싱 후 결과 값이 0e[숫자] 형태가 되는 입력값 두 개를 알아낸다. (하나는 숫자, 하나는 알파벳)
2. 알아낸 입력값을 입력한다.
3. flag값을 얻는다.
먼저, 코딩을 통해 0e[숫자] 형태가 되는 입력값 두 개를 알아내보자. (필자는 python을 이용해서 알아냈다.)
입력값을 알아냈으면 이제 그 값을 넣어서 전송해보자!
그 결과는?
클리어!!