[Перевод] REcollapse: фаззинг с использованием unicode-нормализации

⚠ Дисклеймер ⚠

Данный инструмент/метод создан/описан[/переведён] исключительно для образовательных и этических целей тестирования. Использование данного инструмента для атаки целей без предварительного взаимного согласия является незаконным. Разработчики [и переводчики] не несут никакой ответственности и не отвечают за любое неправильное использование или ущерб, причиненный этим инструментом.

В этом посте я расскажу о технике REcollapse. Я изучал её последние пару лет, чтобы обнаружить до странности простые, но эффективные уязвимости в защищённых объектах. Эта техника может быть использована для захвата учётных записей с нулевым взаимодействием, обнаружения новых обходных путей для брандмауэров веб-приложений и многого другого.

Этот пост преимущественно основан на моём выступлении на BSidesLisbon 2022 и посвящён запуску инструмента recollapse, который теперь доступен на GitHub. Это также то, что мы начали исследовать внутри Ethiack.

Работа с пользовательским вводом

Всё начинается с непредвиденного ввода. Современные приложения и API полагаются на валидацию, санацию и нормализацию. Обычно это делается с помощью пользовательских регулярных выражений и широко используемых библиотек, которые проверяют и преобразуют типичные форматы пользовательского ввода, такие как адреса электронной почты, URL и другие.

Вот несколько примеров валидации и санации:

Валидация (Python)

>>> re.match(r"^\S+@\S+\.\S+$", "aa.com")
>>> re.match(r"^\S+@\S+\.\S+$", "a@a.com")

Санация (PHP)

> htmlspecialchars("input'\">");
= "input'"><script>alert(1);</script>"

Цель всегда состоит в том, чтобы предотвратить сохранение опасного пользовательского ввода. Рассмотрим приложение, которое отвергает специальные символы в имени пользователя в конечной точке /signup. Злоумышленник не может внедрить полезную нагрузку в имя, но это не означает, что в дальнейшем имя не будет санировано, что может привести к уязвимостям, таким как XSS. В этом случае мы можем попытаться найти альтернативные конечные точки, которые принимают специальные символы в одном параметре. Именно так я поступил с @itscachemoney в 2019 году в Dropbox, или же… мы можем попытаться обойти регулярное выражение «чёрным ящиком», как я покажу ниже в этом посте.

Нормализация же используется для обеспечения единообразия пользовательского ввода. Это удобно для приложений с несколькими учетными записями, чтобы избежать дублирования адресов электронной почты, таких как a@a.com / A@a.COM / á@ª.com и так далее. Разные библиотеки дают различные выходные нормализованные данные, как вы можете видеть в этих примерах, что может быть полезно для определения технологий, используемых бэкендом.

Нормализация (PHP)

> iconv("UTF-8", "ASCII//TRANSLIT", "Ãéï°úç");
= "~A'e\"i^0'uc"

Нормализация (Python)

>>> unidecode.unidecode("Ãéï°úç")
'Aeideguc'

Более подробную информацию о нормализации, если вы не знакомы с ней, можно найти здесь: https://

© Habrahabr.ru