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





Это я, пишу скрипт по перебору параметров для 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 утра и ночь без сна, я опаздывал на онлайн встречу и был рад, что нас пропустили без карантина, поэтому просто начал свой путь по Европе.




Комментарии (23):

  1. disakov
    /#22076936

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

    • symbix
      /#22077876 / +3

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

      • disakov
        /#22078012

        Совершенно согласен. Просто это де-факто основной инструмент для веб тестирования, вот и упомянул. Вдруг автор решит еще IDOR поискать где-нибудь.

  2. myemuk
    /#22077066 / -1

    alzimin, Слил данные своей жены )) И, кстати, не забыл ее поздравить с днём рождения? ))

    • Vsevo10d
      /#22079166

      Товарищ, проснитесь, вы не на дваче.

  3. Bringoff
    /#22077600

    был рад, что нас пропустили без карантина

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

    • alzimin
      /#22077638 / +3

      Получили, просто он на другой номер паспорта.
      Но т.к. имя/фамилия и дата рождения совпадает, к тому же у нас был barcode – нам поверили.

  4. irsick
    /#22077616 / +1

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


    Вот так всегда! На самом интересном месте! (с)

  5. alzimin
    /#22077648 / +2

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

    Я быстро запустил через Swift (т.к. в прошлом мобильник и рука набита сделать такое за 1 минуту), но второй бы по приоритету был бы питон.

    • streem
      /#22095816

      Запросы слали через симулятор? :)

      • alzimin
        /#22095818

        Уже не помню, но, вероятно, да или создал macOS приложение)

  6. liquiddeath13
    /#22077994 / +1

    интересная статья! грустно осознавать, что гос. домен не гарантирует высокий уровень сохранности данных. если раскручивать тему с получением персональных данных и дальше… а как там в Турции с контролем за сохранностью и приватностью персональных данных?)

    • PendalFF
      /#22079188

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

    • alzimin
      /#22079254

      Спасибо, я не разбирался в вопросе, но местные продвинутые ребята говорили, что там очень много распила денег и, предпологаю, реализация соответствующая (и товарищ выше тоже это подметил).

  7. Shporsoft
    /#22079238

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

    • TheShock
      /#22079544

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

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

  8. shabelskiy
    /#22079518

    Детектив!

  9. robotikz
    /#22080110

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

    • alzimin
      /#22080114

      Чтобы не сесть на самоизоляцию.

      • IndyCar
        /#22095814

        хак кривой реальности, но сгодится, если не часто такое предпринимать ))

  10. Wesha
    /#22082446

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


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


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

    • alzimin
      /#22083888 / +1

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


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