Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "HTTP - Headers". За решение задачки дают 15 баллов, чуть посложнее начального уровня.
В названии задачки есть подсказка. Скорее всего работать придётся с HTTP заголовками.
Заголовки HTTP (HTTP Headers) — это строки в HTTP-сообщении, содержащие разделённую двоеточием пару имя-значение. Формат заголовков соответствует общему формату заголовков текстовых сетевых сообщений ARPA (см. RFC 822). Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой. С помощью HTTP заголовков браузер и web-сервер обмениваются значениями переменных, такая информация не отображается в тексте web-страницы, поскольку является служебной.
Все заголовки разделяются на четыре основных группы:
- General Headers (Общие заголовки) — используются в запросах и ответах.
- Request Headers (Заголовки запроса) — используются только в запросах.
- Response Headers (Заголовки ответа) — используются только в ответах.
- Entity Headers (Заголовки сущности) — сопровождают каждую сущность сообщения. Используются в запросах и ответах.
На практике нас будут интересовать Request Headers и Response Headers. Заголовки запроса — это то, что посылает браузер web-серверу, а заголовки ответа — это то, что присылает web-сервер браузеру вместе с HTML страницей.
Ссылки
Решение
Переходим на страницу задания:
http://challenge01.root-me.org/web-serveur/ch5/
Видим страницу с текстом "Content is not the only part of an HTTP response!" Нам подсказывают, что в ответе web-сервера содержится не только контент страницы.
Жму F12 и открываю средства разработчика Google Chrome.
Смотрю Response Headers. И сразу же нахожу очень странный заголовок Header-RootMe-Admin:none. Сервер как-бы говорит: "А ты не админ!"
А что будет, если в Request Headers отправить web-серверу такой же заголовок, но вместо "none" передать что-нибудь типа "true"? Как-бы скажем: "А я админ!" Проверим.
Для модификации HTTP заголовков понадобится дополнительное расширение. Нахожу первое попавшееся — ModHeader.
Устанавливаю расширение ModHeader.
В настройках расширения добавляю в Request Headers новую пару ключ-значение: Header-RootMe-Admin:true.
Обновляю страничку задания:
http://challenge01.root-me.org/web-serveur/ch5/
Картина изменилась!
Во-первых, в разделе Request Headers можно увидеть новый добавленный заголовок header-rootme-admin: true.
Во-вторых, контент страницы изменился:
You dit it ! You can validate the challenge with the password HeadersMayBeUseful
И флаг: HeadersMayBeUseful.
Валидируем.
Флаг подходит, зарабатываем 15 очков.
Безопасность
- Web-сервер не должен доверять данным, переданным через Request Headers.
- Не передавайте секретные данные через Response Headers.
- Некоторые уязвимости системы можно устранить добавив в настройках web-сервера необходимые заголовки в Response Headers.
- Есть много разных видов уязвимостей, связанных с HTTP заголовками, просто укажу некоторые направления атаки:
- Злоумышленник может подменить HTTP заголовки и выдать себя за другого пользователя. Веб сервер выполнит нелегитимную операцию, например, переведёт деньги на указанный счёт. Для этого злоумышленнику требуется знат конфиденциальную информацию пользователя, например cookies.
- CSRF (Cross-Site Request Forgery, также XSRF) и подобные типы атак, когда злоумышленник заманивает пользователя на сторонний сайт и как посредник выполняет от имени пользователя действия, не требующие подтверждения. Требуется, чтобы сессия пользователя ещё не истекла, и чтобы на атакуемой стороне (банке) была возможность выполнения операции без подтверждения пользователя.
- Злоумышленник может подменить HTTP заголовки web-сервера. Требуется получить доступ к web-серверу. Простой пример, можно указать в Response Headers любой домен, который сможет считать cookies пользователя от основного домена web-сервера.
- Подменяя заголовки UserAgent при каждом входе можно выдать себя за уникального посетителя. А это кликбейт, регистрация спам-ботов на форумах и соцсетях, накрутка голосов/лайков в опросах и голосованиях и прочее.
- В заголовках передаётся множество информации, каждый заголовок — потенциальная дырка для инъекции в код (PHP, SQL, ...). Web разработчики, валидируйте заголовки!