ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HTB] LoveTok Writeup
    Wargame/Hack The Box 2023. 4. 12. 23:30

    주어진 URL에 접근하면 아래와 같은 페이지가 나타난다.

    별다른 기능은 없고, 하단의 Nah,~ 를 누르면 /?format=r 로 요청이 가고, 시간 정보가 바뀐다.

     

    주어진 소스를 분석해보자.

    //TimeController.php
    <?php
    class TimeController
    {
        public function index($router)
        {
            $format = isset($_GET['format']) ? $_GET['format'] : 'r';
            $time = new TimeModel($format);
            return $router->view('index', ['time' => $time->getTime()]);
        }
    }

    페이지상에서 보여지는 기능이 /?format=r 밖에 없기때문에 우선 관련된 부분을 찾았다. format 파라미터의 내용을 읽어 TimeModel의 인자로 사용한다는 내용이었다.

     

    TimeModel이 어떻게 동작하나 확인해보았다.

    //TimeModel.php
    <?php
    class TimeModel
    {
        public function __construct($format)
        {
            $this->format = addslashes($format);// ............ (1)
    
            [ $d, $h, $m, $s ] = [ rand(1, 6), rand(1, 23), rand(1, 59), rand(1, 69) ];
            $this->prediction = "+${d} day +${h} hour +${m} minute +${s} second";
        }
    
        public function getTime()
        {
            eval('$time = date("' . $this->format . '", strtotime("' . $this->prediction . '"));');
            // ................................ (2)
            return isset($time) ? $time : 'Something went terribly wrong';
        }
    }

    format 파라미터의 값이 addslashs()처리가 된 후에 eval문에 사용된다. 즉, addslashes 를 통해 어느정도 필터링이 되어 있지만, 이를 우회 할 수 있다면 커맨드인젝션이 가능 할 것이다.

     

    참고로 addslashes는 '(따옴표) , "(쌍따옴표), \(백슬래시), \x00(NULL) 앞에 백슬래시를 추가해주는 메소드이다.

     

    우회 기법 관련해서 조사를 해보다가 아래 내용에서 이번 문제와 유사한 내용을 발견했다.

    https://swordandcircuitboard.com/php-addslashes-command-injection-bypass/

     

    PHP addslashes() Command Injection Bypass

    How to bypass addslashes when it's incorrectly used as a sanitizer.

    swordandcircuitboard.com

     

    ${system($_GET[1])}&1=명령어

    와 같이 ${system()} 를 통해 필터링 되지 않는 명령 실행 구문을 만들고,

    $_GET[1] 과 같이 따로 파라미터를 통해 명령어를 입력받는다면 addslashes에서 필터링하는 특수 문자 없이 명령어를 전달한다는 의미이다.

     

    실제로 작동하여 최상위를 조회해보니 flagWKlXr과 같이 flag 뒤에 임의의 문자열이 붙은 파일이 존재함을 알 수 있었고,

     

    이를 읽어 플래그를 획득 할 수 있었다.(롸업 작성하면서 보니 "); // 등 처리는 불필요해보인다.)

     

    FLAG = HTB{wh3n_l0v3_g3ts_eval3d_sh3lls_st4rt_p0pp1ng}

    반응형

    'Wargame > Hack The Box' 카테고리의 다른 글

    [HTB] Toxic Writeup  (0) 2023.04.21
    [HTB] Inject Writeup  (1) 2023.04.19
    [HTB] Weather App Writeup  (0) 2023.04.07
    [HTB] Popcorn Writeup  (0) 2023.03.31
    [HTB] Phonebook Writeup  (0) 2023.03.28

    댓글

Designed by Tistory.