Побывал на #highload2019 и что сказать, там было круто. Знатные доклады, крутые спикеры, не сильно много рекламы, хоть она и была в докладах, но там, где я был она была “уместной”, но речь сейчас пойдет не про это xD

Стенды. Много хороших стендов было у компаний с развлечениями, чтобы разгрузить голову между докладами. Но как вы знаете, не все всегда гладко и именно об одном сденде мы сейчас поговорим, а именно о стенде маркетплейса goods(dot)ru. Эти ребята сделали у себя на стенде соревнование по клавагонкам на thinkpad’ах (именно их ноутах, чтобы всех участников приравнять друг к другу и сделать соревнование offline, но чуть позднее поймете почему это не получилось).

надо писать код на go

Часть 1.

Что сразу попало в глаза, дак это URL, который я смог открыть с телефона без авторизации. Потом, конечно же я открыл его уже со своего ноута и полез изучать что да как с с этим соревнованием.

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

рили вот так

Окей, вызов принят, да здравсвует CURL

ave curl

Ну и результат не заставил себя ждать

hehehe

После этого я подошел к стенду, сказал что типа вот это я и вот что я сделяль с вашим конкурсом. Рассказал что можно исправить и как это сделать. Ребята сказали спасибо, дали носки как презент (hehe, багбаунти) :)

Через минут 20 прилетело обновление скрипта, с захардкоженными ключами. Забавно, конечно, но я решил это проигнорировать, так как посчитал данный результат промежуточным и смотреть что да как уже во второй день конференции.

захардкоженные ключи, мммммм

Часть 2.

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

basic auth

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

И у меня родился гениальный план c элементами социальной инженерии

  1. Подойти к ноуту на стенд (сменив футболку, сняв очки чтобы меня не сильно то вспомнили). На этом шаге как раз и был СИ, но я вам не буду говорить о чем мы говрили и что там было :)
  2. Предпринять попытку пройти соревнование еще раз, но не просто так, а скопировав из дебаггера хрома CURL запрос с автризационным хедером
  3. Так как зная что там винда, воспользоваться горячими клавишами и быстро посмотреть заголовок “Authorization: Basic ...” (да, можно было сразу в хроме, но задним числом мы все умнее)
  4. Посмотреть что будет в этом base64 и повторять запросы снова со свего ноута :)

Как планировалось, так все и получилось :) и у меня на руках был заголовок “Authorization: Basic ...” со знаением YWRtaW46dGVzdDU1NQ==

admin:test555

Да, те, кто знают, уже поняли что это там логин:пароль, то да, это было admin:test555. Оооокей, это уже реально безопаснее в сравнении с прошлой ревизией. Ну так и повтоврили мы запросы, добавив себя в список лидеров.

После этого, из топ-25 (правда пришло всего 5 человек из них) попал на разогрыш главного приза, где уже реальным рандомом с вытягиванием бумажки с ником из шапочки мне посчастливилост выйграть главный приз. Ну штожжж, приятно было, тем более что попасть в топ было действительно интересно, хоть и не совсем тривиальным способом.

Эпилог

  • Делайте авторизации и блокируйте доступ извне к вашим конкурсам, если не хотите чтобы кто-то читерил :)
  • Подписывайте запросы, используйте CSRF токены, проверяйте все на бэкэнде
  • Пишите код хорошо :) А вот вам исходник js с соревнования как бонус для изучения c победным запросом