
Под хайдом тебя ждёт необыкновенная история об изначально обыкновенном дне. История про подмену Host Header или про то, как я открыл тёмную сторону сайта Рускоязычного сообщества Yii.
На дворе шёл 15872 день от начала Unix Epoch. Обычный день. За окном облачно и необычайно хмуро. На столе уже стоит полная кружка крепкого горячего чёрного кофе. На лице лёгкая небритость. Собственно, в лучших традициях киберпанка.
Немного теории
Но сегодня, мы не об этом. Для начала я хочу уточнить, что я подразумеваю под Host Header Injection.
Существует некий специальный header под названием «Host», который отвечает за распознавание веб-сервером необходимого виртуального хоста.
Собственно процесс, примерно, следующий:
- Ввод в адресную строку адреса сайта
- Внутренняя браузерная магия(в большинстве случаев запрос к DNS серверу)
- Запрос к серверу(по адресу предоставленному DNS`ом)
- Ответ сервера и его обработка браузером
Сегодня речь и пойдёт об эксплуатации третьего пункта этого процесса.
Единственным способом узнать, какой хост запросил пользователь, для веб-сервера является, уже знакомый нам хидер «Host».
Но проблема хидеров в том, что они передаются со стороны пользователя, а это значит, что их значения можно с успехом изменить на любые другие.
В теории подобная «уязвимость», открывает нам различные возможности:
- В некоторых движках/фреймворках/скриптах включены различные отладочные инструменты по-умолчанию, если Host = localhost
- Доступ к localhost из внешней сети невозможен, если конечно веб-сервер не сконфигурирован нужным образом, но Host легко позволит нам получить доступ к недоступному localhost
- И многое другое
Эксплуатация
Дойдя до этого пункта, вы возможно зададитесь вопросом «На словах это всё просто отлично, но чем это может угрожать моему серверу/сайту(указать своё)?». В этом случае, для вас, у меня есть хороший пример на довольно популярном сайте Рускоязычного сообщества Yii.
Приступим.
Для начала мой инструментарий:
- Firefox
- Tamper Data
Но на самом деле, это неважно. С таким-же успехом, подобное можно провернуть, используя любой инструментарий, который позволяет изменять хидеры.
Первым делом, мы заходим на этот самый сайт. Убеждаемся в том, что всё отлично.

Далее, открываем Tamper Data, начинаем перехват трафика и обновляем страницу Yii, потверждая вмешивание в запрос.

Меняем наш хидер Host и подтверждаем запрос.

Вот и наш сюрприз, видимо на данном сервере в 2009-ом обитал другой сайт.

Защита
На данный момент, я не вижу стопроцентного способа обезопаситься от этой проблемы, кроме как менять исходные коды уязвимого обеспечения. Ведь хидеры, так-же, как и всё остальное являются пользовательским вводом и им точно так-же нельзя доверять.
Можно, так-же попробовать валидировать хидеры на стороне веб-сервера.
Большое спасибо, за прочтение моей статьи.
Надеюсь сегодня вы убедились в том, что доверять каким-либо данным поступающим от пользователя категорически нельзя.