В чём разница между XSS и CSRF
Межсайтовые сценарии/Межсайтовый скриптинг (XSS) позволяет злоумышленнику выполнять произвольный JavaScript код в браузере пользователя-жертвы.
Подделка межсайтовых запросов (CSRF) позволяет злоумышленнику побудить пользователя-жертву выполнить действия, которые он не намеревался совершать.
Последствия XSS уязвимостей, обычно, более серьёзны, чем последствия CSRF уязвимостей:
- CSRF часто применяется только к подмножеству действий, которые может выполнить пользователь. Многие приложения реализую защиту от CSRF в целом, но упускают из вида одно или два действия, которые остаются незащищёнными. И наоборот, успешный XSS эксплойт обычно может побудить пользователя выполнить любое действие, которое пользователь может выполнить, независимо от функциональности, в которой возникает уязвимость.
- CSRF можно описать как
одностороннюю
уязвимость, поскольку, хотя злоумышленник может побудить жертву выполнить HTTP-запрос, он не может получить ответ на этот запрос. И наоборот, XSS являетсядвусторонней
в том смысле, что внедрённый злоумышленниками сценарий может выдавать произвольные запросы, читать ответы и передавать данные во внешний домен по выбору злоумышленника.
Могут ли CSRF токены предотвратить XSS-атаки
Некоторые XSS-атаки действительно можно предотвратить за счёт эффективного использования CSRF токена. Рассмотрим простую Отражённую XSS-уязвимость, которую можно тривиально использовать следующим образом:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
Теперь предположим, что уязвимая функция включает в себя CSRF токен:
https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>
Если предложить, что сервер правильно проверяет токен CSRF и отклоняет запросы без валидного токена, тогда токен предотвращает использование XSS уязвимости. Подсказка здесь в названии: межсайтовые сценарии
, по крайней мере, в его отражённой форме, включает межсайтовый запрос. Но позволяя злоумышленнику подделать межсайтовый запрос, приложение предотвращает тривиальное использование XSS уязвимости.
Здесь возникает несколько важных предостережений:
- Если отражённая XSS уязвимость существует где-либо ещё на сайте внутри функции не защищённой CSRF токеном, то эту XSS можно использовать обычным способом.
- Если где-либо на сайте существует XSS-уязвимость, которую можно использовать, её можно использовать, чтобы заставить пользователя-жертву выполнять действия, даже если эти действия сами по себе защищены CSRF токенами. В этой ситуации сценарий злоумышленника может запросить соответствующую страницу для получения действительного CSRF токена, а затем использовать токен для выполнения защищённого действия.
- CSRF токена не защищают от сохранённых XSS уязвимостей. Если страница, защищённая CSRF токеном, также является точкой выводя для сохранённой XSS уязвимости, то эту XSS уязвимость можно использовать обычным способом, и полезная нагрузка XSS будет выполнять, когда пользователь посещает страницу.