Обход 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.com

Note

Хотя вы можете выявить такое поведение с помощью Burp, часто оказывается, что этот подход перестаёт работать при проверке вашего PoC в браузере. В попытке снизить риск утечки конфиденциальных данных многими браузерами по умолчанию из заголовка Referer удаляется строка запроса (query string).

Вы можете переопределить это поведение, убедившись, что ответ, содержащий ваш эксплойт, устанавливает заголовок Referrer-Policy: unsafe-url (обратите внимание, что в этом случае Referrer написан правильно — чтобы вы не теряли бдительность!). Это гарантирует отправку полного URL, включая строку запроса.

Last updated