Привет!
Сервера могут по-разному воспринимать присланную пользователем информацию. Общепринято, что %20 или знак + в параметрах принимается за пробел. Запрос на директорию /folder/test/%2e%2e/page — нормализуется до /folder/page, ибо %2e — точка в urlencode. Например, знаменитый (в узких кругах) open redirect работает за счет некорректной нормализации запроса.
Но я тебе расскажу о том, как пробел становится атакой.
Уязвимость в Xbox
В качестве вступления — забавная бага, не моё, но в тему. Пацану 5 лет и он понял, что если ввести пробел вместо пароля — он попадет в аккаунт отца. Как это работало я до сих пор смутно представляю, но вот тебе ссылка ознакомиться поближе.
— А причём тут ты?
А я просто мимо проходил, и оказывается, находился на одной стене почёта с этим мальчиком, и даже попал на TV:
Видел?
Как нет?
Ну ты чего, смотри внимательнее!
Вот же:
Правда всего на треть секунды, быстрым перематыванием страницы. Ну да ладно 😀
Уязвимость на поддомене Yandex
Было замечено, что в стандартной ситуации, один из поддоменов яндекса при обращении к директории /admin/ просит логин и пароль:
http://sqtest.yandex.net/admin/ — 401
Однако, если добавить после admin знак пробела, то в админку пускало.
http://sqtest.yandex.net/admin%20/ — 200
Внутренние ссылки заново просили логин и пароль, однако, подменив вхождение строки «/admin/» в ответе сервера на»/admin%20/», админкой можно было пользоваться. К сожалению, скриншотов у меня не осталось, так что придется поверить мне наслово. Уязвимость давно сдана, деньги получены и потрачены, остались лишь воспоминания.
Уязвимость в Bitbucket Server
Шло время, уязвимость в рамках bugbounty я уже давно забыл, но после очередного брута директорий нарвался на странную аномалию, где опять же, директория /admin с пробелом на конце вернула статус 200, в то время как должен быть редирект на /login
Взглянув на домен, я понял, что там находится bitbucket server, да и версия вроде не древняя. Открыв руками — был удивлён, и правда открывается админка, правда без многих ссылок.
Дальше изучив bitbucket server на локальной машине, опытным путем понял, что сервер отдает содержимое страниц для следующих ссылок:
/admin%20/mail-server
/admin%20/db
/admin%20/db/edit
/admin%20/license
/admin%20/logging
/admin%20/server-settings
/admin%20/authentication
/admin%20/avatars
Выглядит забавно, правда?
Уязвимость позволяет увидеть лишь некоторые директории, например, директория /admin/users/ — недоступна. Также, вместо пробела могут быть символы x01-x20.
Помимо директорий выше — видны установленные плагины, которые тоже могут иметь свои уязвимости.
Бага была исправлена и работает на Bitbucket Server < 4.8. Bitbucket разрабатывает команда atlassian, в свою очередь они делают такие продукты как jira, confluence, hipchat, и может ты, %username%, попробуй изучить подробнее, вдруг я что-то пропустил. И возможно, уязвимость будет в других продуктах компании.
UPD: А тем временем Алексей Писаренко попал в админку одного из сайтов студии Лебедева. А казалось бы — пробел…
Хотелось бы понять в чем причина баги? Что такого несёт зп собой %20/
Думаю, есть некая логика (грубо говоря):
Некий роут пускает на любую страницу, кроме той, что соответствует «/admin/».
«/admin%20/» не соответствует ^/admin/$, значит спрашивать ауз не нужно.
Однако, java нормализует запрос и вырезает пробел (%20), что соответствует обращению к директории /admin/.
С первого взгляда похоже на обычный «trim» для валидации входящих данных.
У меня тоже возник этот вопрос. Очень интересно чем была вызвана дыра. Т.е. по какой логике работал сервер чтоб такое могло произойти.
Как вариант, на роут /admin/ где-то в самом начале роутинга была повешана авторизация. А вот что происходило после прохождения авторизации — загадка. Возможно виновата функция trim().
Нужно смотреть, как работает логика в spring framework и конкретно в bitbucket
Не совсем верно, ведь trim() нужно применить к каждому элементу URI преобразованного в массив, а это делают далеко не все, к сожалению.
Bo0om, спасибо огромное за познавательную статью!