Vander
Staff member
- Nov 10, 2019
- 468
- 1,156
В этом разделе мы объясним, что такое подделка межсайтовых запросов, опишем некоторые примеры распространенных уязвимостей CSRF и объясним, как предотвратить атаки CSRF.
Что такое CSRF?
Подделка межсайтовых запросов (также известная как CSRF) - это уязвимость веб-безопасности, которая позволяет злоумышленнику побудить пользователей выполнить действия, которые они не собираются выполнять. Это позволяет злоумышленнику частично обойти одну и ту же политику безопасности, которая предназначена для предотвращения взаимодействия различных веб-сайтов друг с другом.
В успешной CSRF-атаке злоумышленник заставляет пользователя-жертву непреднамеренно выполнить действие. Например, это может быть изменение адреса электронной почты в учетной записи, изменение пароля или перевод денежных средств. В зависимости от характера действия злоумышленник может получить полный контроль над учетной записью пользователя.
Если скомпрометированный пользователь имеет привилегированную роль в приложении, злоумышленник может получить полный контроль над всеми данными и функциями приложения.
Как работает CSRF?
Для того, чтобы CSRF-атака была возможна, должны быть выполнены три ключевых условия:
- Соответствующее действие. В приложении есть действие, которое у злоумышленника есть причина вызвать. Это может быть привилегированное действие (например, изменение разрешений для других пользователей) или любое действие с данными пользователя (например, изменение собственного пароля пользователя).
- Обработка сеанса на основе файлов cookie. Выполнение действия включает в себя отправку одного или нескольких HTTP-запросов, а приложение полагается исключительно на файлы cookie сеанса для идентификации пользователя, который сделал запросы. Нет другого механизма для отслеживания сеансов или проверки запросов пользователей.
- Никаких непредсказуемых параметров запроса. Запросы, выполняющие действие, не содержат параметров, значения которых злоумышленник не может определить или угадать. Например, когда вы заставляете пользователя изменить свой пароль, функция не будет уязвима, если злоумышленнику необходимо знать значение существующего пароля.
Например, предположим, что приложение содержит функцию, которая позволяет пользователю изменять адрес электронной почты в своей учетной записи. Когда пользователь выполняет это действие, он отправляет HTTP-запрос, подобный следующему:
Code:
POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE
email=wiener@normal-user.com
- Действие по изменению адреса электронной почты в учетной записи пользователя представляет интерес для злоумышленника. После этого действия злоумышленник, как правило, может вызвать сброс пароля и получить полный контроль над учетной записью пользователя.
- Приложение использует файл cookie сеанса, чтобы определить, какой пользователь отправил запрос. Других токенов или механизмов для отслеживания пользовательских сеансов не существует.
- Злоумышленник может легко определить значения параметров запроса, которые необходимы для выполнения действия.
При соблюдении этих условий злоумышленник может создать веб-страницу, содержащую следующий HTML-код:
Code:
<html>
<body>
<form action="https://vulnerable-website.com/email/change" method="POST">
<input type="hidden" name="email" value="pwned@evil-user.net" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
- Страница злоумышленника инициирует HTTP-запрос к уязвимому веб-сайту.
- Если пользователь вошел в систему на уязвимом веб-сайте, его браузер автоматически включит файл cookie сеанса в запрос (при условии, что файлы cookie SameSite не используются).
- Уязвимый веб-сайт обработает запрос обычным образом, будет рассматривать его как сделанный пользователем-жертвой и изменит свой адрес электронной почты.
- Хотя CSRF обычно описывается в связи с обработкой сеанса на основе файлов cookie, он также возникает в других контекстах, где приложение автоматически добавляет некоторые учетные данные пользователя в запросы, такие как базовая аутентификация HTTP и аутентификация на основе сертификатов.