МегаФАИИИИЛ и как не нужно делать соревнования
Побывал на #highload2019 и что сказать, там было круто. Знатные доклады, крутые спикеры, не сильно много рекламы, хоть она и была в докладах, но там, где я был она была “уместной”, но речь сейчас пойдет не про это xD
Стенды. Много хороших стендов было у компаний с развлечениями, чтобы разгрузить голову между докладами. Но как вы знаете, не все всегда гладко и именно об одном сденде мы сейчас поговорим, а именно о стенде маркетплейса goods(dot)ru
. Эти ребята сделали у себя на стенде соревнование по клавагонкам на thinkpad’ах (именно их ноутах, чтобы всех участников приравнять друг к другу и сделать соревнование offline, но чуть позднее поймете почему это не получилось).
Часть 1.
Что сразу попало в глаза, дак это URL, который я смог открыть с телефона без авторизации. Потом, конечно же я открыл его уже со своего ноута и полез изучать что да как с с этим соревнованием.
Что сказать, после беглого осмотра кода было обнаружено, что данные по результату прохождения отправляются без авторизации, проверок и всего такого сразу на сервис и выглядело это вот так
Окей, вызов принят, да здравсвует CURL
Ну и результат не заставил себя ждать
После этого я подошел к стенду, сказал что типа вот это я и вот что я сделяль с вашим конкурсом. Рассказал что можно исправить и как это сделать. Ребята сказали спасибо, дали носки как презент (hehe, багбаунти) :)
Через минут 20 прилетело обновление скрипта, с захардкоженными ключами. Забавно, конечно, но я решил это проигнорировать, так как посчитал данный результат промежуточным и смотреть что да как уже во второй день конференции.
Часть 2.
Начался второй день, открыв ноут я заметил что извне сайт перестал открываться и там везде была авторизация BasicAuth.
Пищальна, но ладно, побрутим (скажу сразу что брутить было лень и после минуты брута пароля с именем admin
я забил и начал думать что делать дальше, да и не сильно то это спортивно).
И у меня родился гениальный план c элементами социальной инженерии
- Подойти к ноуту на стенд (сменив футболку, сняв очки чтобы меня не сильно то вспомнили). На этом шаге как раз и был СИ, но я вам не буду говорить о чем мы говрили и что там было :)
- Предпринять попытку пройти соревнование еще раз, но не просто так, а скопировав из дебаггера хрома CURL запрос с автризационным хедером
- Так как зная что там винда, воспользоваться горячими клавишами и быстро посмотреть заголовок “
Authorization: Basic ...
” (да, можно было сразу в хроме, но задним числом мы все умнее) - Посмотреть что будет в этом base64 и повторять запросы снова со свего ноута :)
Как планировалось, так все и получилось :) и у меня на руках был заголовок “Authorization: Basic ...
” со знаением YWRtaW46dGVzdDU1NQ==
Да, те, кто знают, уже поняли что это там логин:пароль, то да, это было admin:test555
. Оооокей, это уже реально безопаснее в сравнении с прошлой ревизией. Ну так и повтоврили мы запросы, добавив себя в список лидеров.
После этого, из топ-25 (правда пришло всего 5 человек из них) попал на разогрыш главного приза, где уже реальным рандомом с вытягиванием бумажки с ником из шапочки мне посчастливилост выйграть главный приз. Ну штожжж, приятно было, тем более что попасть в топ было действительно интересно, хоть и не совсем тривиальным способом.
Эпилог
- Делайте авторизации и блокируйте доступ извне к вашим конкурсам, если не хотите чтобы кто-то читерил :)
- Подписывайте запросы, используйте CSRF токены, проверяйте все на бэкэнде
- Пишите код хорошо :) А вот вам исходник js с соревнования как бонус для изучения c победным запросом