Таблицы рекордов в приложениях [В]Контакте — взлом и защита

в 9:00, , рубрики: Без рубрики

Предположим, что мы хотим залить на сайт vk.com какую-нибудь flash-казуалку и прикрутить к ней таблицу рекордов. Это довольно распространённая задача и в данной статье я рассмотрю различные подходы к её решению с точки зрения безопасности.

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

Для начала, я проанализировал все запросы от этих приложений при помощи программы Charles и разделил наиболее популярные подходы на две категории в зависимости от того, где хранятся рекорды — на сервере ВКонтакте либо на своём собственном. Для того, чтобы определить, к какой категории относится конкретное приложение, достаточно посмотреть на то, какой сервер вернёт нам список рекордсменов при открытии таблицы рекордов или при запуске приложения.

image

Хранение рекордов на сервере ВКонтакте

Для защиты запросов к ВКонтакте API используется ключ sig, который генерируется на основе viewer_id, всех передаваемых параметров (кроме sid), а также ключа secret. Кроме того, каждый запрос должен содержать sid — идентификатор сессии.

Такая схема позволяет избегать подмены данных в запросах. Например, не зная secret пользователя, а также его sid, мы не сможем выполнить запрос от его имени. Вот только для сохранения рекорда нам не нужно подменять viewer_id, а значит все необходимые параметры у нас есть (их мы можем найти в исходном коде страницы приложения).

image

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

Ниже — подделка запросов на сохранение рекорда на примере трёх приложений:

Snake — Змейка:

image

image

Мега-шарик — аркада с необычным геймплеем:

image

image

Тигра:

image

image

Хранение рекордов на собственном сервере

Все запросы, идущие к вашему серверу также могут быть подделаны.

В качестве демонстрации я вновь воспользовался программой Charles и подменил запрос на сохранение рекорда в приложении Пушкин:

image

image

image

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

Рассмотрим такую систему на примере приложения Пчелиная атака — игра для друзей.

Я скачал файл приложения на свой ПК и открыл его при помощи программы Sothink SWF Decompiler.

image

image

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

image

image

Я бы не смог этого сделать, если бы файл приложения был пропущен через обфускатор (например, secureSWF).

Заключение

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

Автор: Dolgofor

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js