<?php
$flag = "???";
if(isset($_GET['time'])) {
if(!is_numeric($_GET['time'])) {
echo '시간은 숫자만 됩니다!';
} else if($_GET['time'] < 60 * 60 * 24 * 30 * 2) {
echo '시간이 너무 짧습니다!';
} else if($_GET['time'] > 60 * 60 * 24 * 30 * 3) {
echo '시간이 너무 깁니다!';
} else {
sleep((int)$_GET['time']);
echo "flag is ", $flag;
}
echo '<hr>';
}
?>
접속하면 나타나는 코드다. Time값을 가져와 숫자인지 검사 후, 5184000~7776000 사이에있는지 검사한다.
그리고 time값 만큼 sleep 한 뒤 flag를 출력해준다.
5184000초면 약 2달이란 시간인데, 그만큼 기다릴 수 없으니 다른 방법을 찾자.
2020/03/09 - [Wargame Write-Up/HackCTF] - [HackCTF] (Web) 마법봉 풀이
저번에 나온 php의 type juggling 을 이용해 풀 수 있는 문제다.
is_numbric 함수는 5e+2 등의 지수형태도 숫자라고 판단한다.
그리고 sleep함수에서 (int) 형으로 캐스팅한다. 그러면 소수점이하는 날라가버린다.
이 두가지 정보로 입력값을 만들어보자.
5.184001e+6 을 입력하면, 5184000~7776000 사이의 숫자고,
int형으로 캐스팅하면 . 이하는 날라가서 5초 sleep 하고 flag가 출력된다.