상세 컨텐츠

본문 제목

[HackCTF-Web#9] Time - 150 points

WebHacking/HackCTF

by bing_su 2021. 3. 24. 15:18

본문

반응형
SMALL

HackCTF Web의 9번째 문제는 Time이다.

문제 링크: http://ctf.j0n9hyun.xyz:2032

문제에서 php 코드가 주어져 있다. GET 방식으로 time에 시간을 입력하고, 조건을 만족하면 flag가 출력된다. 

else if($_GET['time'] < 60 * 60 * 24 * 30 * 2) {
	echo '시간이 너무 짧습니다!';
} else if($_GET['time'] > 60 * 60 * 24 * 30 * 3) {
	echo '시간이 너무 깁니다!';

조건문 부분을 살펴보자. 60 * 60 * 24 * 30 * 2의 값은 5,184,000고, 60 * 60 * 24 * 30 * 3의 값은 7,776,000이다. 따라서 이 사이의 time 값이 되도록 입력하면 문제가 풀린다고 생각할 수 있다.

else {
	sleep((int)$_GET['time']);
    echo "flag is ",  $flag;
}

문제의 else 부분이다. 입력한 시간이 지나야 flag를 알 수 있다. 하지만 sleep 함수의 기본 단위가 초라는 것을 고려할 때 주어진 조건에 맞도록 시간을 그대로 입력하면 2~3 달이 지나야 플래그를 확인할 수 있다.

이 문제가 의도하는 바는 원래의 경우 긴 시간을 지나서 플래그를 얻어야 하지만, 큰 숫자를 우회해 짧은 시간 안에 플래그를 구하는 것이라고 생각했다. 관련 취약점으로는 is_numeric() 함수 취약점이 있다.

 

is_numeric 함수의 경우 숫자로 인식되기만 하면 true를 반환한다. 따라서 정수만이 아니라 지수 표현도 숫자로 인식한다. 이것이 이 문제를 풀어나가는 데 핵심적인 부분이다.

else {
	sleep((int)$_GET['time']);
    echo "flag is ",  $flag;
}

이 부분을 다시 보자. time을 지수 표현으로 5.184001e6의 형식으로 입력하자. sleep 함수의 인자로 쓰이는 time 값은 int 형으로 변환되면서 소수점 이하를 버리기 때문에 5초라는 짧은 시간이 지나면 플래그를 얻을 수 있다.

이 값을 입력하면 5초가 지난 후 플래그가 보인다, 이를 인증하면 문제가 풀린다.

 

반응형
LIST

관련글 더보기

댓글 영역