Атака кросс-сайт-запроса (CSRF) использует общепринятую логику веб-браузеров для управления сеансом пользователя на открытых страницах. Стандарт заключается в том, что пользователь может иметь только один активный сеанс в веб-приложении, которое он использует в настоящее время. Любая вновь открытая вкладка в вашем браузере будет автоматически использовать файлы cookie пользователя, уже вошедшего в систему. Злоумышленник использует этот факт чаще всего, отправляя своей жертве специально подготовленную ссылку, после нажатия на которую будет срабатывать действие (например, смена пароля) на странице, где у жертвы есть активная сессия.
Защита от такого типа атак чаще всего заключается в добавлении специального уникального и непредсказуемого параметра, по крайней мере, за сеанс, который приклеивается как переменная к чувствительным запросам (например, смена пароля, добавление нового пользователя) и корректность которого проверяется сервером. Злоумышленник, не знающий значения этого маркера, не может создать запрос, который сервер не отклонит из-за несоответствия маркера antiCSRF.
В одном из протестированных приложений я обнаружил возможность проведения многих CSRF-атак. Одним из примеров является подготовка специально созданной страницы, после ввода которой вошедшим в систему пользователем будет сделан запрос на изменение пароля от имени пользователя. Ниже приведен код для этой страницы, а также параметры, отвечающие за ввод нового пароля. Обратите внимание, что в выбранной строке в следующей распечатке отображается код, определяющий полеформы ввода, в котором определен новый пароль.
Автоматически отправленный запрос, использующий сеансы от пользователя, вошедшего на подставленную страницу, выглядит следующим образом:
Хост: XXXXX
Пользовательский агент: Mozilla/5.0 (X11; x86_64 Linux; rv:45.0) Gecko/20100101 Firefox/45.0
[...]
-----------------------------70124987214088125821572825923
Content-Disposition: form-data; name="newpassword"
csrf
[...]
В ответ приложение подтверждает смену пароля, что показано на следующем скриншоте: