$30 off During Our Annual Pro Sale. View Details »

31337

 31337

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.

Bo0oM

May 01, 2022
Tweet

More Decks by Bo0oM

Other Decks in Technology

Transcript

  1. Anton Lopanitsyn

    View Slide

  2. Ошибки
    округления
    Скажем, злоумышленник переводит 0,29
    рубле
    й
    в доллары США. При стоимости
    одного доллара в 60 рубле
    й
    , сумма в 0,29
    рубле
    й
    соответствует
    0,00483333333333333333333333333333
    долларов. Данная сумма будет округлена
    до двух знаков после запято
    й
    , т. е. до 0,01
    доллара (один цент). Затем
    злоумышленник переводит 0,01 доллара
    обратно в рубли и получает 0,60 рубле
    й
    .
    Таким образом злоумышленник
    «выигрывает» 0,31 рубле
    й
    .


    ZN 2013

    View Slide

  3. View Slide

  4. Минусовые значения. Пример из ДБО
    Создаем платежку на -1,000,000
    Бухгалтером подписываем платежку
    Получаем на счет +1,000,000

    View Slide

  5. View Slide

  6. Экспоненциальная
    запись числа



    $a = 1e10;


    $b = 500;


    $a - $b; // 9999999500

    View Slide

  7. •Например, WebMoney абсолютно нормально воспринимает
    сумму платежа со значением 1e1 или 0xFF, а сравнение
    подобных чисел, еще и на старых версиях PHP, еще и с учетом
    нюансов сравнения в языке PHP, приводило к самым
    неожиданным последствиям.

    View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. Олды
    помнят
    2^32 = 4,294,967,296


    vk.com/id1 == vk.com/id4294967297

    View Slide

  12. Page.asp?id=%27%22%3c%3e


    '"<>…


    Page.asp?id=%Z1%TS


    Йђ

    View Slide

  13. Page.asp?id=%Z1%OT


    Йђ


    Page.asp?id=%XX%XX%XX%XX%XX%XX%XX%XX…


    View Slide

  14. Тест-кейсы
    Разные системы счисления и экспонента


    Отрицательные числа и с знаком +


    Умножения, деление (в том числе на 0)


    Граничные и числа с переполнением для
    разной разрядности


    Заведомо некорректные (это ж фаззинг) числа
    с множественными точками


    True, False, NULL, NaN, NIL, None, undefined

    View Slide

  15. Большие числа
    (прост история для бара)

    View Slide

  16. Предсказуемость чисел в ПГСЧ
    Рекомендую доклады по поломке ПГСЧ от Positive Technologies
    (запрещенная в США организация)


    https://habr.com/ru/company/pt/blog/156133/


    https://habr.com/ru/company/pt/blog/149746/


    https://xakep.ru/2018/04/12/ethereum-cheating/


    https://static.ptsecurity.com/phdays/presentations/phdays-9-luarocks-
    vulnerabilities.pdf (из последнего)

    View Slide

  17. View Slide

  18. Timestamp
    Коды восстановления
    пароля
    Кастомные сессионные
    идентификаторы (как в
    вебе, так и в мобильном
    приложении)
    Имена файлов,
    идентификаторы
    сообщений и прочих
    объектов
    Собственные
    имплементации (псевдо)
    хэширования и
    криптографии

    View Slide

  19. Случайности не случайны
    Восстановление пароля


    Код восстановления пароля: 96318231973159


    Или перейдите по ссылке.


    Удалите письмо, если вы не запрашивали смену пароля, бла-бла

    View Slide

  20. Sort

    View Slide

  21. View Slide

  22. Используя методы отправки запросов для
    эксплуатации состояния гонки (race condition),
    было отправлено несколько токенов. Идея была в
    том, что отправив два запроса на восстановление
    пароля, на собственную почту и жертве, придут
    одинаковые или минимально различимые коды.



    После множества попыток было получено
    максимальное приближение:



    Почта 1:


    56794300990116



    Почта 2:


    56756301990116

    View Slide

  23. Запрашиваем пароль. Смотрим, что в ответе веб-приложения есть заголовок Date:


    Date: Mon, 08 Jun 2020 08:14:10 GMT


    Переводим эту дату в timestamp. В данном случае это будет 1591604050.


    Сравниваем с полученным кодом - 50501015409368.


    (А теперь посмотри на цифры внимательно).

    View Slide

  24. 50501015409368


    1591604050

    View Slide

  25. 00001134555689


    0001145569
    Код восстановления - 50501015409368, это время 1591604050 + 5038, где 4 цифры либо что-то случайное,
    либо миллисекунды.

    View Slide

  26. В результате было собрано около 150 токенов восстановления
    и значений времени

    View Slide

  27. В результате было собрано около 150 токенов восстановления и
    значений времени:

    View Slide

  28. View Slide

  29. Exploit

    View Slide

  30. Заливаешь файл, получаешь ссылку


    /docs/download/ 5c0a32b42a390d33023363eb.pdf


    Твои действия?


    View Slide

  31. Заливаешь файл, получаешь ссылку /docs/
    download/5c0a32b42a390d33023363eb.pdf


    Думаешь, заливаешь второй


    /docs/download/5c0a2af62a390d3302335b57.pdf

    View Slide

  32. 5c0a0f142a390d3302333cdd
    Timestamp,


    контролируешь его изменение
    Идентификатор тачки,


    узнается заранее
    PID
    Инкремент

    View Slide

  33. Другой вариант:
    /?id=61254cb7e45f08fea8024c0d
    /?id=61254cb4451630ba8aedcdbf

    View Slide

  34. 61254cb4451630ba8aedcdbf
    ??)

    View Slide

  35. Приведения
    типов

    View Slide

  36. Аккуратнее с фаззингом чисел

    View Slide

  37. TL;DR
    • Используем мутирующие фаззеры для тестирования веб-
    приложений, как это делают бинарщики. Есть простор для
    мутаций чисел и поисков аномалий в их обработке (сравнении,
    изменении)


    • Случайности не случайны, если не используются
    криптографически безопасные алгоритмы


    • Nodejs и прочие ребята с приведениями типов вообще отдельная
    тема

    View Slide

  38. https://bo0om.ru


    https://t.me/webpwn


    https://twitter.com/i_bo0om

    View Slide