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초가 지난 후 플래그가 보인다, 이를 인증하면 문제가 풀린다.
[HackCTF-Web#11] Home - 200 points (0) | 2022.01.10 |
---|---|
[HackCTF-Web#10] Input Check - 150 points (0) | 2021.03.24 |
[HackCTF-Web#8] 마법봉 - 100 points (0) | 2021.03.24 |
[HackCTF-Web#7] Login - 100 points (0) | 2021.03.24 |
[HackCTF-Web#6] Read File - 100 points (0) | 2021.03.23 |
댓글 영역