Подделка межсайтовых запросов (CSRF) — это тип атаки, которая происходит, когда вредоносный веб-сайт, электронная почта, блог, мгновенное сообщение или программа заставляет веб-браузер пользователя выполнять нежелательное действие на доверенном сайте, когда пользователь аутентифицирован. — Памятка OWASP по предотвращению подделки межсайтовых запросов
CSRF можно обнаружить во многих кибератаках, особенно на многих веб-сайтах социальных сетей. В этих статьях я объясняю вам, как можно предотвратить CSRF и как работают эти методы предотвращения.
Это первая часть из двух частей серии «Предотвращение подделки межсайтовых запросов». Вторую часть этой серии см.
Предотвращение подделки межсайтовых запросов (Часть вторая) — шаблон двойной отправки файлов cookie
Давайте поговорим о шаблоне токена синхронизатора.
Шаблон токена синхронизатора использует зашифрованный токен в среде, где клиент и сервер обмениваются конфиденциальными данными. Этот токен обычно создается и хранится на стороне сервера при входе в систему, и клиент запрашивает токен перед отправкой любых конфиденциальных данных на сервер.
Клиент отправляет этот токен с конфиденциальными данными на сервер. Когда сервер получает маркер, сервер проверяет правильность полученного маркера, проверяя, соответствует ли он маркеру, сохраненному на сервере. Если токен совпадает, сервер принимает полученные данные, а сервер отклоняет полученные данные, если токен не совпадает, выдавая сообщение об ошибке.
Демо
Чтобы продемонстрировать, как работает этот шаблон, я создал образец веб-сайта. Это простой веб-сайт, который использует шаблон токена синхронизатора и ничего более.
Сначала пользователь предоставляет страницу «Вход». Учетные данные для входа жестко закодированы, поэтому вам не нужно беспокоиться о создании учетных записей. Просто укажите имя пользователя и пароль как "admin" (без кавычек), и все готово.
При входе в систему пользователь предоставляет страницу «Пользователь». Вы можете увидеть кнопку «Удалить учетную запись» и ссылку «Выход». Здесь мы сосредоточимся на кнопке «Удалить учетную запись». Нажмите на нее и посмотрите результат.
После нажатия кнопки «Удалить учетную запись» вы можете увидеть результат о том, что ваша учетная запись удалена.
Так что ничего особенного не произошло. где тогда предотвращение CSRF?
Как известно, настоящее волшебство происходит за кулисами. Давайте посмотрим код страницы пользователя.
<body> <h1>Welcome Admin!</h1> <form method="POST" action="submit.php" id="csrf"> <button name="param" value="delete" type="submit">Delete Account</button> </form> <a href="logout.php">Logout</a> <script> var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var tokenInput = document.createElement("INPUT"); tokenInput.setAttribute("type", "hidden"); tokenInput.setAttribute("name", "token"); tokenInput.setAttribute("value", this.response); document.getElementById("csrf").appendChild(tokenInput); } }; ajax.open("POST", "token_request.php", true); ajax.send(); </script> </body>
Здесь вы можете видеть, что есть скрипт ajax, который запускается при загрузке HTML-документа. Скрипт ajax отправляет запрос на «token_request.php», запрашивая токен CSRF. (Эта страница запрашивает токен CSRF, поскольку удаление учетной записи может рассматриваться как конфиденциальная задача.)
когда токен CSRF будет получен, он будет встроен в форму отправки (где находится «Удалить учетную запись») в виде скрытого поля. Когда пользователь нажимает кнопку, форма отправляет данные в «submit.php» вместе с токеном CSRF.
«submit.php» использует «token_check.php» для проверки токена CSRF и возвращает результат, основанный на совпадении токена.
Если Злоумышленник попытается атаковать Пользователя с помощью CSRF?
Давайте откроем документ, содержащий CSRF-атаку.
<body onload="document.csrf.submit();"> <form action="http://localhost/CSRF/Synchronizer_Token/submit.php" method="POST" name="csrf"> <input type="hidden" name="param" value="delete"> </form> </body>
Как видите, злоумышленник знает, куда должен идти запрос. Хотя токена CSRF нет, поэтому запуск этой страницы приведет к перенаправлению на страницу с сообщением о том, что токен CSRF не соответствует.
Полный исходный код можно найти на моем GitHub.
https://github.com/kumudunee/CSRF_Synchronizer_Token_Pattern