На самом деле правильнее назвать статью «как накрутить себе баллы в конкурсе, чтобы выиграть целый холодильник RedBull». У нас, кстати, в офисе уже стоит такой холодильник с напитками.
![](https://habrastorage.org/getpro/habr/post_images/a3b/7e8/d83/a3b7e8d83979acadafef7074ce7ae064.jpg)
Когда в очередной раз в офис доставили соки, газировки и другие напитки в офис, я обнаружил листовку с рекламой конкурса, суть которого заключалась в прохождении игры и победитель выигрывал холодильник энергетических напитков.
Второй холодильник нам бы не помешал – мы как раз расширились, и у нас появились новые офисные кабинеты. Поэтому я прошел по ссылке и решил попытать удачу, моя попытка оказалась провальной и я оказался где-то в конце рейтинга. Игра заключалась в том, чтобы пройти несколько уровней лабиринта максимально быстро.
Теперь надо надеть солнцезащитные очки, включить vpn, всевозможные прокси и т.д.
Прекрасно понимая, что любая игра в вебе – это последовательность запросов, и зная рынок разработки, на котором немало дилетантов, я решил попытать удачу в другом направлении и вдруг наткнусь на дыры в игре. Не то, чтобы мне так нужен был этот холодильник, просто появился спортивный интерес.
http://redbull.ru/work
Будем отслеживать запросы в браузере, после этого попробуем эти же запросы отправить, но уже с измененными значениями.
![](https://habrastorage.org/getpro/habr/post_images/4a8/519/bd1/4a8519bd16588c882e803914881502fb.png)
Первым делом идет запрос на старт игры:
При этом в ссылке замечаем
Пару раз обновляем страницу в браузере, открывает с другого ip и в другом браузере, этот параметр не меняется, предполагаем, что это константа-идентификатор игры.
Еще замечаем, что в параметрах заголовка типа данных
В ответ на этот запрос получаем ответ:
![](https://habrastorage.org/getpro/habr/post_images/ff9/4ab/7a2/ff94ab7a2357be7c5a3dcb05ff55e4a8.png)
В ответе можно заметить разные атрибуты и еще один
Начинаем игру.
![](https://habrastorage.org/getpro/habr/post_images/62d/680/553/62d6805539195359fd72db0fdc08f452.png)
Наблюдаем над запросами. Видим, что ничего нового не появляется, то есть никакие этапы прохождения игры не триггерятся. На всякий случай проверил, может что-то ходит по веб-сокетам – там тоже пусто.
![](https://habrastorage.org/getpro/habr/post_images/5cc/23f/584/5cc23f5847caf6804beaa8c14f717650.png)
По завершению игры мы где-то в рейтинге, но мы не первые, что нас сильно огорчает. Пока что.
Смотрим в консоль и видим, что отправились еще 2 запроса, но один из них на получение статей, другой на получение рейтинга игроков. Полезного тут мало, запоминаем рейтинг первого места – 61454667.
Нажимаем на кнопку сохранения результата.
![](https://habrastorage.org/getpro/habr/post_images/3f6/e06/ed3/3f6e06ed38f0ea14a952757efc224ef4.png)
Отправился еще один запрос на url
с параметрами
Становится очевидным, что ссылка формируется из статичного id игры и id нашей сессии. В параметрах передается счет, который будет сохранен за нами и участвовать в рейтинге.
![](https://habrastorage.org/getpro/habr/post_images/e87/cbe/c7e/e87cbec7eaf30612b137187f0a8cb115.png)
На следующем этапе открывается страница с формой, которая подгружается в iframe. Замечаем, что в ссылке участвует наш сессионный id:
После отправки формы, получаем подтверждение.
![](https://habrastorage.org/getpro/habr/post_images/3ea/931/979/3ea93197923099c04769087322686506.png)
Теперь повторим все те же самые запросы, но уже не через браузер.
Я буду использовать Postman.
Отправляем запрос на
![](https://habrastorage.org/getpro/habr/post_images/daa/205/dfe/daa205dfe39d95b247852583ae640ddb.png)
Получили ответ:
Самое важное тут
Теперь формируем ссылку для получения рейтинга. Нам нужен будет наш сессионный id и результат, который будет больше текущего рекорда 61454667. Возьмем для эстетики первый цифры числа 2*pi, как раз чуть больше рекорда.
Отправляем запрос
![](https://habrastorage.org/getpro/habr/post_images/b42/b9f/281/b42b9f281bdafaa0d8dc941268c39f0b.png)
В ответе видим, что мы уже первые в списке, теперь сохраним результат.
Отправим запрос на
В этом запросе важно еще прописать атрибуты заголовков.
![](https://habrastorage.org/getpro/habr/post_images/9c7/8b5/9bf/9c78b59bfc19dc92cebcb2e3760d2dc1.png)
![](https://habrastorage.org/getpro/habr/post_images/09d/eef/eb9/09deefeb9bd611ff92c31eda5063294f.png)
Супер! Все прошло ок, получили подтверждение результата. Теперь необходимо отправить контактные данные, чтобы с нами связались RedBull.
Для этого просто в браузере открываем ссылку с формой с нашим сессионным id.
![](https://habrastorage.org/getpro/habr/post_images/a1e/179/2f4/a1e1792f4265ad01798cae32e096f703.png)
Заполняем форму.
Отправляем.
![](https://habrastorage.org/getpro/habr/post_images/b83/f59/7ee/b83f597ee190ecac311ae4414a24f4bd.png)
Получаем подтверждение!
Конкурс уже закончился, он действовал до 31 января 2020.
P.S. На момент публикации розыгрыш завершен, во время проведения акции мы в ней не участвовали, на победу не претендовали. Все описания носят только информационный характер. Никакие коммерческие и иные ценности этими действиями не преследовались.
![](https://habrastorage.org/getpro/habr/post_images/a3b/7e8/d83/a3b7e8d83979acadafef7074ce7ae064.jpg)
Когда в очередной раз в офис доставили соки, газировки и другие напитки в офис, я обнаружил листовку с рекламой конкурса, суть которого заключалась в прохождении игры и победитель выигрывал холодильник энергетических напитков.
Второй холодильник нам бы не помешал – мы как раз расширились, и у нас появились новые офисные кабинеты. Поэтому я прошел по ссылке и решил попытать удачу, моя попытка оказалась провальной и я оказался где-то в конце рейтинга. Игра заключалась в том, чтобы пройти несколько уровней лабиринта максимально быстро.
Теперь надо надеть солнцезащитные очки, включить vpn, всевозможные прокси и т.д.
Перейдем к делу
Прекрасно понимая, что любая игра в вебе – это последовательность запросов, и зная рынок разработки, на котором немало дилетантов, я решил попытать удачу в другом направлении и вдруг наткнусь на дыры в игре. Не то, чтобы мне так нужен был этот холодильник, просто появился спортивный интерес.
http://redbull.ru/work
Будем отслеживать запросы в браузере, после этого попробуем эти же запросы отправить, но уже с измененными значениями.
![](https://habrastorage.org/getpro/habr/post_images/4a8/519/bd1/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
В ответ на этот запрос получаем ответ:
![](https://habrastorage.org/getpro/habr/post_images/ff9/4ab/7a2/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
, который судя по всему является нашим персональным идентификатором игры. Начинаем игру.
![](https://habrastorage.org/getpro/habr/post_images/62d/680/553/62d6805539195359fd72db0fdc08f452.png)
Наблюдаем над запросами. Видим, что ничего нового не появляется, то есть никакие этапы прохождения игры не триггерятся. На всякий случай проверил, может что-то ходит по веб-сокетам – там тоже пусто.
![](https://habrastorage.org/getpro/habr/post_images/5cc/23f/584/5cc23f5847caf6804beaa8c14f717650.png)
По завершению игры мы где-то в рейтинге, но мы не первые, что нас сильно огорчает. Пока что.
Смотрим в консоль и видим, что отправились еще 2 запроса, но один из них на получение статей, другой на получение рейтинга игроков. Полезного тут мало, запоминаем рейтинг первого места – 61454667.
Нажимаем на кнопку сохранения результата.
![](https://habrastorage.org/getpro/habr/post_images/3f6/e06/ed3/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 нашей сессии. В параметрах передается счет, который будет сохранен за нами и участвовать в рейтинге.
![](https://habrastorage.org/getpro/habr/post_images/e87/cbe/c7e/e87cbec7eaf30612b137187f0a8cb115.png)
На следующем этапе открывается страница с формой, которая подгружается в iframe. Замечаем, что в ссылке участвует наш сессионный id:
https://redbull.jotform.com/93071907238864&runid=4f89d56d-884e-42e8-909d-d1e7547cc1d8&runscore=11041900&redirect=https://maze.redbull.com
После отправки формы, получаем подтверждение.
![](https://habrastorage.org/getpro/habr/post_images/3ea/931/979/3ea93197923099c04769087322686506.png)
Теперь повторим все те же самые запросы, но уже не через браузер.
Я буду использовать Postman.
Отправляем запрос на
https://rb-prjct-crtns-gamebackend-eu.herokuapp.com/api/high-scores/games/8970c40a-98f0-4395-85c8-66177fb38af0/runs
![](https://habrastorage.org/getpro/habr/post_images/daa/205/dfe/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
![](https://habrastorage.org/getpro/habr/post_images/b42/b9f/281/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
В этом запросе важно еще прописать атрибуты заголовков.
![](https://habrastorage.org/getpro/habr/post_images/9c7/8b5/9bf/9c78b59bfc19dc92cebcb2e3760d2dc1.png)
![](https://habrastorage.org/getpro/habr/post_images/09d/eef/eb9/09deefeb9bd611ff92c31eda5063294f.png)
Супер! Все прошло ок, получили подтверждение результата. Теперь необходимо отправить контактные данные, чтобы с нами связались RedBull.
Для этого просто в браузере открываем ссылку с формой с нашим сессионным id.
https://redbull.jotform.com/93071907238864&runid=f95dad7c-eecf-4d3a-88e9-a32661a484e4&runscore=61454667&redirect=https://maze.redbull.com
![](https://habrastorage.org/getpro/habr/post_images/a1e/179/2f4/a1e1792f4265ad01798cae32e096f703.png)
Заполняем форму.
Отправляем.
![](https://habrastorage.org/getpro/habr/post_images/b83/f59/7ee/b83f597ee190ecac311ae4414a24f4bd.png)
Получаем подтверждение!
Конкурс уже закончился, он действовал до 31 января 2020.
P.S. На момент публикации розыгрыш завершен, во время проведения акции мы в ней не участвовали, на победу не претендовали. Все описания носят только информационный характер. Никакие коммерческие и иные ценности этими действиями не преследовались.
x893
Видимо студенты-программисты, нанятые RedBull, ещё не дошли дошли до курса «Основы шифрации». На следующем конкурсе проверите.
nikolayz
А при чем тут шифрация? Score шифровать? Кто мешает хакеру зашифровать преувеличенный score самому? Если игровой клиент имеет ключи для зашифровки своих данных и расшифровки данных от сервера, значит и взломщик рано или поздно получит доступ к этим ключам. Вопрос только в сложности взлома. А если клиент не имеет доступа к ключам, то и зашифровать/расшифровать общение с сервером не сможет.
Тут же налицо классическая проблема любой онлайн игры — они зачем-то стали доверять клиентскому коду, что он пошлет корректный score обратно. А ему доверять нельзя, потому что он полностью находится в руках взломщика и уязвим для анализа и манипуляций.
И простого решения тут нет. Можно слать в конце еще и реплей (какие кнопки нажимались и в какой момент) и проверять на сервере, но его также можно подделать. Да даже если, например, во время игры постоянно отправлять на сервер информацию о нажатых кнопках и валидировать на сервере таймстамп и ввод на предмет того, что игрок не ходит сквозь стены и не телепортируется, то что мешает игроку написать бота, который пробежит это расстояние за максимально короткое время?
Andrey_Dolg
Ну да, вопрос только в окупаемости усилий и наличии нужных знаний.
x893
Я немного о другом. Сам подход к такому проектированию немного упрощённый. Те кто проектируют видимо не предполагают, что кто-то будет смотреть внутрь и тем более ломать за холодильник. В коммерческих системах такой подход обычно не применяется.
Taraflex
Суть не в честном розыгрыше и интересной игре, а в финальной формочке, где нужно свои контакты оставить.