CSRF: Обход защиты основанной на Referer
HTTP Referer
Заголовок HTTP Referer (который случайно написали с ошибкой в HTTP спецификации) — необязательный заголовок запроса, содержащий URL-адрес страницы, связанной с запрашиваемым ресурсом. Как правило, он автоматически добавляется браузерами, когда пользователь запускает HTTP-запрос, в том числе кликая по ссылке или отправляя форму. Существуют разные методы позволяющие ссылающейся странице скрывать или изменять значение поля Referer HTTP-заголовка. Часто это делается из соображений конфиденциальности.
Валидация 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
Примечание. Хотя вы можете определить это поведение с помощью сканера уязвимостей, часто можно обнаружить, что этот подход больше не работает, когда вы начинаете тестировать свою концепцию в браузере. Многие браузеры по умолчанию удаляют строку запроса с заголовком Referer
пытаясь таким образом снизить риск утечки конфиденциальных данных.
Вы можете переопределить это поведение, убедившись, что в ответе содержащем ваш эксплойт, установлен заголовок Referrer-Policy: unsafe-url
(обратите внимание, что в данном случае Referrer
пишется правильно). Это гарантирует, что будет отправлен полный HTTP-адрес, включая строку запроса.