본문 바로가기

보안공부/SolveMe 풀이

SolveMe Winter sleep 풀이 - 긴 시간

오늘은 Winter sleep 문제를 풀어보자.

 

링크에 들어가니 다음과 같은 코드가 나왔다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
    error_reporting(0);
    require __DIR__.'/lib.php';
    if(isset($_GET['time'])){
        if(!is_numeric($_GET['time'])){
            echo 'The time must be number.';
        }else if($_GET['time'< 60 * 60 * 24 * 30 * 2){
            echo 'This time is too short.';
        }else if($_GET['time'> 60 * 60 * 24 * 30 * 3){
            echo 'This time is too long.';
        }else{
            sleep((int)$_GET['time']);
            echo $flag;
        }
        echo '<hr>';
    }
    highlight_file(__FILE__);Tt3YWxmY="))));
?>
cs

GET 메소드를 통해 넘겨받은 값이 5184000보다 크고 7776000보다 작으면 넘겨받은 값만큼 대기한 후에 플래그(인증 값)을 넘겨주는 코드였다.

 

하지만 만약 5184001을 입력할 경우, 약 2달을 기다려야 한다.

상단의 is_numeric함수에 대해 알아보던 도중 상수표현 e도 숫자로 처리된다는 사실을 알게 되었다.

 

숫자가 맞는지 확인하기 전에는 따로 자료형을 전환해주는 함수 또는 필터링이 없기 때문에 5184000과 같은 값인 5.184e6으로 우회가 가능할것 같았다.

뒤에있는 int 자료형이 뒤에 있는 소수점을 모두 떼어주어 5.184e6은 5가 되니 5초만 기다리면 답이 출력된다는 말이다.

따라서 time 파라미터를 통해 5.184e6을 전달해주면 5초후 정답이 나온다.

 

이렇게 풀이에 성공했다.