Как плохо спроектированный UX у теста на коронавирус чуть не посадил нас на самоизоляцию, но дырка в безопасности спасла


    Это я, пишу скрипт по перебору параметров для POST запроса на gov.tr, сидя перед границей в Хорватию.

    Как все начиналось


    Мы с моей женой путешествуем по миру и работаем удаленно. Недавно переезжали из Турции в Хорватию (самая оптимальная точка, чтобы заехать в Европу). Чтобы не сесть на карантин в Хорватии, нужно иметь справку об отрицательном анализе на ковид, сделанном не позже 48 часов до въезда.

    Выяснили, что относительно выгодно (2500 рублей) и быстро (всем результаты приходят в течение 5 часов) делают тест в аэропорту Стамбула, из которого мы как раз и вылетали.

    В аэропорт приехали за 7 часов до вылета, нашли пункт сдачи теста. Делают все сумбурно: подходишь, даешь паспорт, платишь, получаешь 2 наклейки с barcode, идешь в мобильную лабораторию, там у тебя забирают одну из этих наклеек для идентификации твоего анализа. После выходишь, и тебе говорят: заходи на этот сайт: enabiz.gov.tr/PcrTestSonuc, вбивай свой баркод и последние 4 цифры паспорта, через какое-то время будет результат.



    Но если вбивать данные сразу после сдачи анализа, страница выдает ошибку.




    Уже тогда в мою голову закрались мысли о “прекрасном” UX, в котором при любой ошибке оператора, который вбивал паспортные данные, нет никакого способа узнать свой результат.

    Перед вылетом


    Приходит время вылета, я вбиваю свои данные и вижу, что документы по ним уже есть, хотя и результата теста пока нет.




    Даже видно, что тесты поступили в лабораторию 1.5 часа назад. Но на ввод данных моей жены все еще выдается ошибка, что запись не найдена. А главное, не получится просто сходить и спросить, что не так, т.к. тест мы сдавали в зоне до паспортного контроля.

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

    Стоило мне зайти в самолет, как по моему коду появилась информация, что у меня тест отрицательный.



    По прилету


    И вот тут начинается веселье! Как только мы прилетели и подключились к местному WiFi, выяснилось, что запись моей жены так и не находится в базе. А на самой границе к документам подходили очень внимательно: пограничник брал тест на коронавирус и уносил в отдельную комнату на проверку его реальности. Мы решили, что расскажем нашу трустори как есть и узнаем, какие у нас есть варианты.

    Пока мы стояли в очереди, я решил проверить на правильных (своих) и неправильных данных, как реагирует страница валидации.

    Выяснилось, что она отправляет пост запрос на www.enabiz.gov.tr/PcrTestSonuc/GetPcrRaporVerifyWithKimlik, со следующими параметрами:

    barkodNo=XX
    kimlikNo=YY
    kimlikTipi=2
    где barkodNo – номер баркода, kimlikNo – номер паспорта, kimlikTipi – фиĸсированный параметр, равный 2 (если заполнять тольĸо первые два поля). Никаких токенов не было видно. На правильные параметры (мои данные) запрос отдавал 1, а на неправильные – 0.

    Из постмана я попробовал перебрать 40 комбинаций (вдруг ошибка в один символ), но ничего не вышло.

    В этот момент мы подошли к пограничнику, он выслушал нашу историю и предложил карантин. Но нам явно не хотелось сидеть 14 дней в квартире, поэтому мы попросились немного подождать в транзитной зоне, чтобы за пару часов попробовать разобраться с проблемой. Пограничник вошел в наше положение, сходил узнать, можно ли нам посидеть в белой зоне, и, с согласия руководителя, сказал: «okay, just couple of hours».

    Я начал искать телефон тех, ĸто делал тест на ĸорону, и параллельно решил протестировать безумную гипотезу: если у этой системы такой ужасный UX, то и система безопасности не должна быть хорошей, хотя и домен gov.tr.

    В итоге, сидя на звонках, я написал небольшой скрипт, который перебирал все числа от 0000 до 9999 в поле kimlikNo. barkodNo у нас был на наклейке, поэтому он не мог быть неверным.

    Представляете мое удивление, когда даже после 500 непрерывных запросов я не был забанен, а скрипт продолжал бегать со скоростью 20 запросов в секунду с WiFi аэропорта.

    Звонки большого успеха не дали: меня перенаправляли от одного департамента ĸ другому. Но очень скоро скрипт выдал заветное значение 6505, что было совсем не похоже на реальные 4 цифры паспорта.

    После загрузки документа, выяснилось, что там явно не паспорт моей жены (таких номеров даже не бывает у российских загранников), но все остальные данные (включая имя, фамилию и дату рождения) являются верными.



    Самое интересное, что баркоды тоже не являются случайными, а идут почти один за одним. Тем самым, в теории, я бы мог найти контакты, кому достался номер паспорта моей жены, да и в целом плавно выкачать приватные данные других людей.

    Но было 9 утра и ночь без сна, я опаздывал на онлайн встречу и был рад, что нас пропустили без карантина, поэтому просто начал свой путь по Европе.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 23

      +10
      Для быстрого перебора вместо скрипта можно юзать бесплатную версию Burp Suite. Там все для этого есть. А так IDOR, отсутствие лимита на запросы. Классика. Хотя лимит тоже можно обойти, смотря как он сделан.
        +19

        В ситуации, когда надо получить результат в крайне ограниченное время, уж точно лучше написать скрипт на хорошо знакомом языке, чем пытаться изучить незнакомый софт. Тем более там писать-то)

          +1
          Совершенно согласен. Просто это де-факто основной инструмент для веб тестирования, вот и упомянул. Вдруг автор решит еще IDOR поискать где-нибудь.
        –36
        alzimin, Слил данные своей жены )) И, кстати, не забыл ее поздравить с днём рождения? ))
          +16
          Товарищ, проснитесь, вы не на дваче.
          +2
          был рад, что нас пропустили без карантина

          Что-то тема не раскрыта — результаты теста жены вы ведь так и не получили? Почему тогда пропустили?

            +14
            Получили, просто он на другой номер паспорта.
            Но т.к. имя/фамилия и дата рождения совпадает, к тому же у нас был barcode – нам поверили.
            +2
            Но было 9 утра и ночь без сна, я опаздывал на онлайн встречу и был рад, что нас пропустили без карантина, поэтому просто начал свой путь по Европе.


            Вот так всегда! На самом интересном месте! (с)
              +4
              Тут был комментарий про то, на чем писал скрипт (я его случайно замьютил).

              Я быстро запустил через Swift (т.к. в прошлом мобильник и рука набита сделать такое за 1 минуту), но второй бы по приоритету был бы питон.
                0
                Запросы слали через симулятор? :)
                  0
                  Уже не помню, но, вероятно, да или создал macOS приложение)
                +1
                интересная статья! грустно осознавать, что гос. домен не гарантирует высокий уровень сохранности данных. если раскручивать тему с получением персональных данных и дальше… а как там в Турции с контролем за сохранностью и приватностью персональных данных?)
                  +3
                  Учитывая отзывы от тамошних товарищей про открытую коррупцию на всех уровнях государства, смею предположить что никак примерно.
                    0
                    Спасибо, я не разбирался в вопросе, но местные продвинутые ребята говорили, что там очень много распила денег и, предпологаю, реализация соответствующая (и товарищ выше тоже это подметил).
                    0

                    Тут и в платформах онлайн-обучения есть 'дыры'. Например в onlinemektep.org. Я получал плохие баллы по тестам, 7/10. После этого решил изучить систему, и понял что UI/UX написан на фреймворке Vue.js. А данные в шаблон передаются по открытому JSON который виден в Devtools>Application>Storage. Правильные ответы помечены флажком "right":true. Когда я это узнал, радости не было предела! Только жаль что JSON Beautifier всегда выдает ошибку неправильного синтаксиса.

                      0
                      Только жаль что JSON Beautifier всегда выдает ошибку неправильного синтаксиса.

                      Вполне возможно, что там просто не JSON, а джаваскрипт. Можно попробовать сделать евал в консоли
                    0
                    Детектив!
                      0

                      Смысл такое ломать? Это же прототипы, на быструю руку сделаны

                        +7
                        Чтобы не сесть на самоизоляцию.
                          –1
                          хак кривой реальности, но сгодится, если не часто такое предпринимать ))
                        0

                        А зачем номер паспорта "526**6505" замазывали? Сами ж говорите — он неизвестно чей. Так что для читателей это просто число, ничего с ним не сделать. :)


                        А за 2 часа вполне можно было взять страницу "своего" результата, в HTML подправить имя-фамилию и показать как результат жены :)


                        А как сейчас — погранец мог бы посмотреть на женин результат и сказать — "чё это вы мне показываете, у вас номер пачпорта не такой!"

                          +1

                          Замазал для приличия, это чужой паспорт.


                          Прилетали люди из Стамбула с одинаковыми системами теста, на них был QR код ведущий на официальный сайт, где были написаны данные, пограничники уходили в отдельную комнату, где специальные люди проводили с распечаткой пару минут. Догадываюсь, что тут риски были слишком большие и не стоили себя ;)

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое