Web applications always operate with numbers. However, things don’t always go the way developers intended. Let’s discuss abnormal cases of working with number values and talk about exploiting vulnerabilities using them.
Ошибки округления Скажем, злоумышленник переводит 0,29 рубле й в доллары США. При стоимости одного доллара в 60 рубле й , сумма в 0,29 рубле й соответствует 0,00483333333333333333333333333333 долларов. Данная сумма будет округлена до двух знаков после запято й , т. е. до 0,01 доллара (один цент). Затем злоумышленник переводит 0,01 доллара обратно в рубли и получает 0,60 рубле й . Таким образом злоумышленник «выигрывает» 0,31 рубле й .
•Например, WebMoney абсолютно нормально воспринимает сумму платежа со значением 1e1 или 0xFF, а сравнение подобных чисел, еще и на старых версиях PHP, еще и с учетом нюансов сравнения в языке PHP, приводило к самым неожиданным последствиям.
Timestamp Коды восстановления пароля Кастомные сессионные идентификаторы (как в вебе, так и в мобильном приложении) Имена файлов, идентификаторы сообщений и прочих объектов Собственные имплементации (псевдо) хэширования и криптографии
Используя методы отправки запросов для эксплуатации состояния гонки (race condition), было отправлено несколько токенов. Идея была в том, что отправив два запроса на восстановление пароля, на собственную почту и жертве, придут одинаковые или минимально различимые коды.
После множества попыток было получено максимальное приближение:
TL;DR • Используем мутирующие фаззеры для тестирования веб- приложений, как это делают бинарщики. Есть простор для мутаций чисел и поисков аномалий в их обработке (сравнении, изменении)
• Случайности не случайны, если не используются криптографически безопасные алгоритмы
• Nodejs и прочие ребята с приведениями типов вообще отдельная тема