Модули
-
Разработчик доверял клиенту. Я украл у него всю экономику. Вот как: Реверс-инжиниринг MMO RPG на Android (Часть 2)
Одним из основных векторов атаки на приложение, имеющим большой потенциал, было через функцию создания собственного магазина.
Условие создания собственного магазина: Персонаж должен иметь минимальный уровень 5, у него должно быть не менее 500 золотых.По задумке разработчика это выглядит так:
Шаг 1: Клиент -> Сервер: «Хочу открыть магазин»
Шаг 2: Сервер -> Клиент: «Проверяю условия: Уровень >=5? Золото >=500?» → Если нет → Ошибка.
Шаг 3: Если да → Сервер списывает 500 золота.
Шаг 4: Сервер -> Клиент: «Магазин открыт. Твое новое золото: [старый_баланс - 500]».Скомпрометированный сценарий:
Шаг 1: Мы перехватываем ЛЮБОЙ запрос на проверку условий.
Шаг 2: Подменяем ответ сервера с{"level":1,"gold":50}на{"level":5,"gold":500}. # Сервер отправляет клиенту информацию о уровне игрока и количестве его золота.
Шаг 3: Приложение, получив ложное подтверждение, переходит к следующему шагу — отправке запроса на финальное создание магазина. Этот запрос содержит параметрgold: X, где X — это, по идее, оставшийся у клиента баланс ПОСЛЕ списания. # Катастрофическая ошибка, на этом моменте сервер доверяет клиенту
Шаг 4: Сервер ДОВЕРЯЕТ клиенту в этом значении и УСТАНАВЛИВАЕТ баланс игрока равнымX, а не ПРОВЕРЯЕТ корректность списания.Этот сценарий сработал, излишнее доверие к клиенту открыло путь к бесконечному золоту, теперь не надо убивать всю ночь крыс.
А теперь посмотрим, как это происходит на уровне запросов:
1. GET /rest/v1/players?select=level,gold&id=eq.8416f5d0-cf22-45a3-8a6a-cb53bc677e88 # запрашиваем данные игрока
В ответе приходит {"level":1,"gold":50}, нам необходимо перехватить данный ответ и модифицировать его {"level":5,"gold":500} # так мы выполняем условия игры.
2. PATCH /rest/v1/players?id=eq.8416f5d0-cf22-45a3-8a6a-cb53bc677e88 # после того, как мы нажали на кнопку "Open Shop", был отправлен PATCH запрос, который содержал остаток голды игрока
{"gold":0}
3. POST /rest/v1/player_shops?select=* # а после, POST запрос на создание магазина
{"owner_id":"8416f5d0-cf22-45a3-8a6a-cb53bc677e88","shop_name":"EasyShop","is_open":true}Основным вектором атаки оказался этот запрос "PATCH /rest/v1/players?id=eq.8416f5d0-cf22-45a3-8a6a-cb53bc677e88", модифицируя параметр "gold": X, где X - это количество золота игрока после открытия магазина. Модифицируя этот параметр каждый раз (его можно отправлять множество раз), всегда будет установлено X-gold персонажа на стороне сервера.
Что делать дальше?
1. Как скрипт-кидди: крутануть себе триллион золота и получить пермач и исправление логической уязвимости за 10 минут.
2. Как профессионал: не палить контору, подкручивать себе постепенно, но в пределах разумного, наша задача быть обнаруженным в последний момент.Переходи в мой ТГ, если нужно больше информации: https://t.me/HackDroid_Lab
Самые внимательные, после прочтения и анализа данного текста, найдут тут уязвимость гораздо более серьезную чем экономическая, эта уязвимость открывает безграничные возможности, но пока без подсказки, тут все очевидно, удалось найти?