Как «взломать» RedBull

На самом деле правильнее назвать статью «как накрутить себе баллы в конкурсе, чтобы выиграть целый холодильник RedBull». У нас, кстати, в офисе уже стоит такой холодильник с напитками.


a3b7e8d83979acadafef7074ce7ae064.jpg

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

Второй холодильник нам бы не помешал — мы как раз расширились, и у нас появились новые офисные кабинеты. Поэтому я прошел по ссылке и решил попытать удачу, моя попытка оказалась провальной и я оказался где-то в конце рейтинга. Игра заключалась в том, чтобы пройти несколько уровней лабиринта максимально быстро.

Теперь надо одеть солнцезащитные очки, включить vpn, всевозможные прокси и т.д.


Перейдем к делу.

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

http://redbull.ru/work

Будем отслеживать запросы в браузере, после этого попробуем эти же запросы отправить, но уже с измененными значениями.


4a8519bd16588c882e803914881502fb.png

Первым делом идет запрос на старт игры:
https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/api/high-scores/games/8970c40a-98f0-4395-85c8-66177fb38af0/runs

При этом в ссылке замечаем id = 8970c40a-98f0-4395-85c8-66177fb38af0
Пару раз обновляем страницу в браузере, открывает с другого ip и в другом бразуере, этот параметр не меняется, предполагаем, что это константа-идентификатор игры.
Еще замечаем, что в параметрах заголовка типа данных accept: application/vnd.api+json

В ответ на этот запрос получаем ответ:


ff94ab7a2357be7c5a3dcb05ff55e4a8.png

{
    "data":{
        "attributes":{
            "finished_at":null,
            "game_day":114,
            "game_week":17,
            "score":null
        },
        "id":"4f89d56d-884e-42e8-909d-d1e7547cc1d8",
        "links":{
            "self":"https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/runs/4f89d56d-884e-42e8-909d-d1e7547cc1d8"
        },
        "relationships":{},
        "type":"runs"
    },
    "included":[],
    "links":{
        "self":"https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/runs/4f89d56d-884e-42e8-909d-d1e7547cc1d8"
    }
}

В ответе можно заметить разные атрибуты и еще один id = 4f89d56d-884e-42e8-909d-d1e7547cc1d8, который судя по всему является нашим персональным идентификатором игры.

Начинаем игру.


62d6805539195359fd72db0fdc08f452.png

Наблюдаем над запросами. Видим, что ничего нового не появляется, то есть никакие этапы прохождения игры не триггерятся. На всякий случай проверил, может что-то ходит по веб-сокетам — там тоже пусто.


5cc23f5847caf6804beaa8c14f717650.png

По завершению игры мы где-то в рейтинге, но мы не первые, что нас сильно огорчает. Пока что.
Смотрим в консоль и видим, что отправились еще 2 запроса, но один из них на получение статей, другой на получение рейтинга игроков. Полезного тут мало, запоминаем рейтинг первого места — 61454667.
Нажимаем на кнопку сохранения результата.


3f6e06ed38f0ea14a952757efc224ef4.png

Отправился еще один запрос на url https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/api/high-scores/games/8970c40a-98f0-4395-85c8-66177fb38af0/runs/4f89d56d-884e-42e8-909d-d1e7547cc1d8/submit
с параметрами

{
    "data":{
        "id":"8970c40a-98f0-4395-85c8-66177fb38af0",
        "type":"runs",
        "attributes":{
            "score":11041900
        }
    }
}

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


e87cbec7eaf30612b137187f0a8cb115.png

На следующем этапе открывается страница с формой, которая подгружается в iframe. Замечаем, что в ссылке участвует наш сессионный id: https://redbull.jotform.com/93071907238864&runid=4f89d56d-884e-42e8-909d-d1e7547cc1d8&runscore=11041900&redirect=https://maze.redbull.com

После отправки формы, получаем подтверждение.


3ea93197923099c04769087322686506.png

Теперь повторим все те же самые запросы, но уже не через бразуер.
Я буду использовать Postman.

Отправляем запрос на https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/api/high-scores/games/8970c40a-98f0-4395-85c8-66177fb38af0/runs


daa205dfe39d95b247852583ae640ddb.png

Получили ответ

{
    "data": {
        "attributes": {
            "finished_at": null,
            "game_day": 114,
            "game_week": 17,
            "score": null
        },
        "id": "f95dad7c-eecf-4d3a-88e9-a32661a484e4",
        "links": {
            "self": "https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/runs/f95dad7c-eecf-4d3a-88e9-a32661a484e4"
        },
        "relationships": {},
        "type": "runs"
    },
    "included": [],
    "links": {
        "self": "https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/runs/f95dad7c-eecf-4d3a-88e9-a32661a484e4"
    }
}

Самое важное тут id = f95dad7c-eecf-4d3a-88e9-a32661a484e4

Теперь формируем ссылку для получения рейтинга. Нам нужен будет наш сессионный id и результат, который будет больше текущего рекорда 61454667. Возьмем для эстетики первый цифры числа 2*pi, как раз чуть больше рекорда.
Отправляем запрос https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/api/high-scores/games/8970c40a-98f0-4395-85c8-66177fb38af0/runs/f95dad7c-eecf-4d3a-88e9-a32661a484e4/leaderboard?score=62831853&filter[interval]=none


b42b9f281bdafaa0d8dc941268c39f0b.png

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

Отправим запрос на https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/api/high-scores/games/8970c40a-98f0-4395-85c8-66177fb38af0/runs/f95dad7c-eecf-4d3a-88e9-a32661a484e4/submit
В этом запросе важно еще прописать атрибуты заголовков.


9c78b59bfc19dc92cebcb2e3760d2dc1.png
09deefeb9bd611ff92c31eda5063294f.png

Супер! Все прошло ок, получили подтверждение результата. Теперь необходимо отправить контактные данные, чтобы с нами связались RedBull.

Для этого просто в браузере открываем ссылку с формой с нашим сессионным id.

https://redbull.jotform.com/93071907238864&runid=f95dad7c-eecf-4d3a-88e9-a32661a484e4&runscore=61454667&redirect=https://maze.redbull.com


a1e1792f4265ad01798cae32e096f703.png

Заполняем форму.
Отправляем.


b83f597ee190ecac311ae4414a24f4bd.png

Получаем подтверждение!
Конкурс уже закончился, он действовал до 31 января 2020.

P.S. На момент публикации розыгрыш завершен, во время проведения акции мы в ней не участвовали, на победу не претендовали. Все описания носят только информационный характер. Никакие коммерческие и иные ценности этими действиями не преследовались.

© Habrahabr.ru