Модули

  • @niko13teen

    Разработчик доверял клиенту. Я украл у него всю экономику. Вот как: Реверс-инжиниринг 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

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

    Ответов: 2 Репостов: 1 Лайков: 5
    0/360