Обход CSRF-защит на основе Referer
Помимо защит, использующих CSRF (межсайтовая подделка запросов) токены, некоторые приложения пытаются защищаться от CSRF-атак с помощью HTTP-заголовка Referer, обычно проверяя, что запрос произошёл с домена самого приложения. Этот подход в целом менее эффективен и часто подвержен обходам.
Заголовок Referer
HTTP-заголовок Referer (который по ошибке написан с опечаткой в спецификации HTTP) — это необязательный заголовок запроса, содержащий URL веб-страницы, с которой была дана ссылка на запрашиваемый ресурс. Обычно он автоматически добавляется браузерами, когда пользователь инициирует HTTP-запрос, в том числе при клике по ссылке или отправке формы. Существуют различные методы, позволяющие странице-источнику скрыть или изменить значение заголовка Referer. Это часто делается по соображениям конфиденциальности.
Проверка Referer зависит от наличия заголовка
Некоторые приложения проверяют заголовок Referer, когда он присутствует в запросах, но пропускают проверку, если заголовок опущен.
В этой ситуации атакующий может сконструировать свой CSRF-эксплойт так, чтобы браузер жертвы отбросил заголовок Referer в результирующем запросе. Добиться этого можно разными способами, но самый простой — использовать тег META на HTML-странице, где размещена CSRF-атака:
<meta name="referrer" content="never">Проверку Referer можно обойти
Некоторые приложения проверяют заголовок Referer наивным образом, что позволяет обойти проверку. Например, если приложение валидирует, что домен в Referer начинается с ожидаемого значения, то атакующий может поместить это значение как поддомен собственного домена:
http://vulnerable-website.com.attacker-website.com/csrf-attackАналогично, если приложение просто валидирует, что Referer содержит собственное доменное имя, атакующий может поместить требуемое значение в другую часть URL:
http://attacker-website.com/csrf-attack?vulnerable-website.comLast updated