CSRF: Обход защиты основанной на Referer

Источник: «Bypassing Referer-based CSRF defenses»
Помимо средств защиты, использующих CSRF токены, некоторые приложения используют HTTP-заголовок Referer, для попытки защититься от CSRF атак путём проверки того, что запрос исходит из собственного домена приложения. Как правило, этот подход менее эффективен и имеет обходные пути.

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-адрес, включая строку запроса.

Дополнительные материалы

Предыдущая Статья

XSS: Использование уязвимостей

Следующая Статья

PHP: Продление срока службы легаси приложений