Разбираем седьмую задачку из нашего соревнования CTF. Задание называется silmarill store, 478 баллов за флаг.
В задании предлагается посмотреть на некий простенький интернет-магазин.
Ссылки
Решение
В задачке встретятся различные логические уязвимости, связанные с недостаточной валидацией входных данных.
Рассматриваем магазинчик.
У нас есть пользователь, у него 100 рублей на счету. И есть два товара, мусор, который стоит 1 рубль и Silmaril, который стоит много, у нас столько нет. Подозреваю, что в задаче нужно попытаться купить драгоценность.
Пробуем купить мусор.
Замечаем, что баланс уменьшился на 1 рубль.
Пробуем купить драгоценность.
Неудачка.
Попробуем обычный вариант: подменить идентификаторы товаров. Заменим у мусора идентификатор товара на идентификатор драгоценности. Этот способ используют мошенники и в обычных магазинах — переклеивают этикетки и дорогой товар покупают по цене недорогого.
Посмотрим идентификатор драгоценности:
Название идентификатора "id", значение "0". Смотрим идентификатор мусора:
У мусора id=1. Заменяем его на "0":
Покупаем мусор.
А вот и флаг!
P.S.
У задачки есть ещё несколько решений.
- Вместо подмены id можно заменить стоимость у драгоценности, тоже прокатывает.
- Можно купить мусор за отрицательное количество рублей, тогда сумма на счету не уменьшится, а увеличится. Это ещё один из распространённых типов уязвимости - не учитывать отрицательные значения.
Безопасность
В интернет-магазинах идёт работа с деньгами, нужно проверять всё досконально, особенно если у вас всё автоматизировано.
- Проверяйте стоимость товара.
- Проверяйте идентификаторы товаров.
- Проверяйте отрицательные величины.