mirror of https://github.com/yandex/gixy
32 lines
2.3 KiB
Markdown
32 lines
2.3 KiB
Markdown
![]() |
# [host_spoofing] Подделка заголовка запроса Host
|
|||
|
|
|||
|
Зачастую, приложению, стоящему за Nginx, необходимо передать корректный заголовок `Host` для корректной генерации различных URL-адресов (редиректы, ресурсы, ссылки в письмах и т.д.).
|
|||
|
Возможность его подмены злоумышленником может повлечь множестве проблем от фишинговых атак до SSRF, поэтому следует избегать таких ситуаций.
|
|||
|
|
|||
|
> Возможно, ваше приложение так же ориентируется на заголовок запроса `X-Forwarded-Host`.
|
|||
|
> В этом случае вам необходимо самостоятельно позаботится о его корректной установке при проксировании.
|
|||
|
|
|||
|
## Как самостоятельно обнаружить?
|
|||
|
Чаще всего эта проблема возникает в результате использования переменной `$http_host` вместо `$host`.
|
|||
|
|
|||
|
Несмотря на их схожесть, они сильно отличаются:
|
|||
|
* `$http` - хост в порядке приоритета: имя хоста из строки запроса, или имя хоста из заголовка `Host` заголовка запроса, или имя сервера, соответствующего запросу;
|
|||
|
* `$http_host` - заголовок запроса "Host".
|
|||
|
|
|||
|
Пример такой конфигурации:
|
|||
|
```nginx
|
|||
|
location @app {
|
|||
|
proxy_set_header Host $http_host;
|
|||
|
# Other proxy params
|
|||
|
proxy_pass http://backend;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## Что делать?
|
|||
|
К счастью, все довольно очевидно:
|
|||
|
* перечислить корректные имена сервера в директиве `server_name`;
|
|||
|
* всегда использовать переменную `$host`, вместо `$http_host`.
|
|||
|
|
|||
|
## Дополнительная информация
|
|||
|
* [Host of Troubles Vulnerabilities](https://hostoftroubles.com/)
|
|||
|
* [Practical HTTP Host header attacks](http://www.skeletonscribe.net/2013/05/practical-http-host-header-attacks.html)
|