Skip to main content

Когда символ пробела — атака

By 18 января 201711 августа, 2017Blog
Ты не пройдешь

Привет!

Сервера могут по-разному воспринимать присланную пользователем информацию. Общепринято, что %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: А тем временем Алексей Писаренко попал в админку одного из сайтов студии Лебедева. А казалось бы — пробел…

Join the discussion 6 комментариев

  • Zhu:

    Хотелось бы понять в чем причина баги? Что такого несёт зп собой %20/

    • Думаю, есть некая логика (грубо говоря):
      Некий роут пускает на любую страницу, кроме той, что соответствует «/admin/».
      «/admin%20/» не соответствует ^/admin/$, значит спрашивать ауз не нужно.
      Однако, java нормализует запрос и вырезает пробел (%20), что соответствует обращению к директории /admin/.

      • mimoprohodil:

        С первого взгляда похоже на обычный «trim» для валидации входящих данных.

    • Pascal:

      У меня тоже возник этот вопрос. Очень интересно чем была вызвана дыра. Т.е. по какой логике работал сервер чтоб такое могло произойти.
      Как вариант, на роут /admin/ где-то в самом начале роутинга была повешана авторизация. А вот что происходило после прохождения авторизации — загадка. Возможно виновата функция trim().

      • Нужно смотреть, как работает логика в spring framework и конкретно в bitbucket

      • Не совсем верно, ведь trim() нужно применить к каждому элементу URI преобразованного в массив, а это делают далеко не все, к сожалению.

        Bo0om, спасибо огромное за познавательную статью!

Leave a Reply