# Небезопасная конфигурация
Приложение уязвимо если:
- среда, где развернуто приложения работает с настройками из "коробки"
- включены неиспользуемые функции в работе приложения
- в приложении используются учетные записи по-умолчанию со стандартными паролями
- отчеты об ошибках показывают информацию о версии и используемом софте
- отключены функции защиты после проведения обновления систем
- фреймворки и системы веб серверов не настроены в соответствии с безопасными рекомендациями
- не производится ревью заголовков безопасности на используемые значения
- фрагменты приложения не обновляются и содержат известные уязвимости
## Последствия эксплуатации
От получения доступа к конфигурационным файлам приложения до полной компрометации сервера.
Приложение само по себе может быть написано без единой ошибки, но за счет отсутствующих настроек и выполнения пунктов предыдущего раздела, может быть уязвимо.
## Основные проблемы администрирования и разработки, приводящие к уязвимостям
- оставленные включенными интерфейсы отладки
- допущены ошибки в конфигурации веб-сервера
- допущены ошибки в конфигурации заголовков из фреймворка (либо используются значения по-умолчанию)
## Заголовки безопасности:
### X-Frame-Options
Заголовок отправляется от сервера и используется для того чтобы браузер рендерил, либо нет, данные в тегах
**\<frame\>, \<iframe\>, \<embed\>** или **\<object\>**.Основная задача заголовка не дать реальзиоваться click-jacking атакам. Основной принцип таких атак это добавление контента другого ресурса на страницу пользователя.
Конечно же работать этот заголовок будет, если у пользователя браузер поддерживает его.
Проверить поддерживается ли заголовок можно, например [тут](https://caniuse.com/?search=x-frame-options).
Возможные значения:
- **deny** - все контроллируемые теги не будут рендериться браузером
- **sameorigin** - будут рендериться только те теги, которые попали на страницу с того же origin
::: warning
X-Frame-Options внутри \<meta\> элемента не будут использоваться для работы современного браузера, нужно передавать их только в виде заголовка.
:::
### Strict-Transport-Security
Заголовок используется для того чтобы настроить безопасное шифрованное соединение, которое будет сложно подвергунть атаке MiTM и down grade атаке.
У заголовка могут быть следующие значения:
- **max-age=\<expire-time\>** - время в секундах, обычно указывают порядка 3х лет
- **includeSubDomains** - дополнительный параметр, применяет правила ко всем поддоменам
- **preload** - когда используется max-age директива должна быть установлена значением минимум 1 год, так же должна быть директива includeSubDomains. Данная фича поддерживается google и не является частью спецификации.
Проверить preload можно [тут](https://hstspreload.org/?domain=ya.ru).
### X-Content-Type-Options
Заголовок, который так же проставляет сервер для браузера. Создан для того чтобы сообщить браузеру, что передаваемые данные будут в типе **MIME**, который прописан в заголовке **Content-Type**.
Используется для того чтобы нельзя было подменить тип данных, которые передаются. Потому что в противном случае браузер начнет выполнять команды, которые находятся в данных.
Впервые был внедрен в IE.
### Referrer-Policy
Заголовок регулирует сколько информации о refer нужно добавить в запрос.
Значения директивы:
**no-referrer** - не включать никакой информации
**no-referrer-when-downgrade** - отправить **origin**, путь отправлять при условии, что меняется протокол по правилам - **(HTTP→HTTP, HTTP→HTTPS, HTTPS→HTTPS)**.
Не отправлять заголовок, если протокол меняется по правилам - **(HTTPS→HTTP, HTTPS→file).**
**origin** - отправлять только origin
**origin-when-cross-origin**
When performing a same-origin request to the same protocol level (HTTP→HTTP, HTTPS→HTTPS), send the origin, path, and query string. Send only the origin for cross origin requests and requests to less secure destinations (HTTPS→HTTP).
**same-origin**
Send the origin, path, and query string for same-origin requests. Don't send the Referer header for cross-origin requests.
**strict-origin**
Отправлять отлько origin если протокол сохраняется - (HTTPS→HTTPS). Не отправлять заголовок Referer если будет работать правило - (HTTPS→HTTP).
**strict-origin-when-cross-origin (default)**
Отправлять origin, путь, и строку запроса при взаимодействии с тем же origin. Для кросс origin взаимодействия отправлять данные только если работа происходит по правилам - (HTTPS→HTTPS). Не отправлять заголовок если понижают безопасность канала Referer (HTTPS→HTTP).
## Примеры уязвимостей
В большинстве случаев уязвимости данного типа не встречаются по причине только отсутствия заголовка при использовании приложения.
Могут быть ситуации, когда в приложении есть релевантная для заголовка уязвимость, и он не включен.
Самый распространенный пример - XSS. Об особенностях работы бразуеров и том как можно использовать параметры заголовков чтобы управлять поведением браузера, можно прочитать [тут](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
## Способы защиты
- постоянно проводить аудит параметров, которые используются для конфигурации заголовков