[Перевод] 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://