Bug2Lab · Secure Code · Java / Spring Security

CSRF: изменение данных без токена защиты

В приложении отключена CSRF-защита. Злоумышленник может заставить уже залогиненного пользователя (у которого есть сессия/куки) выполнить POST-запрос на изменение почты/пароля, просто подсовывая скрытую форму.

1
Как выглядит атака
Жертва заходит на злой сайт. Там автопост форма: POST /user/email/update от имени жертвы (куки сессии прилагаются браузером автоматически).
Hidden form auto-submitted to /user/email/update
newEmail=hacker@evil.example
passwordConfirm=123456

Сервер отвечает 200 OK. Почта жертвы изменена.
2
Почему это стало возможным
В конфигурации Spring Security CSRF был отключён «чтоб не мешало фронту». Значит сервер не проверяет, что запрос пришёл именно с нашего сайта.
Проблемный код
15@Bean
16SecurityFilterChain filter(HttpSecurity http) throws Exception {
17 http
18 .csrf(csrf -> csrf.disable()) // ❌ CSRF отключён
19 .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
20 return http.build();
21}
3
Как это чинится правильно
Включаем CSRF и требуем csrf-токен во всех state-changing запросах (POST/PUT/DELETE). Браузер атакующего такой токен не знает → запрос блокируется.
Исправленный паттерн
15@Bean
16SecurityFilterChain filter(HttpSecurity http) throws Exception {
17 http
18 .csrf(csrf -> csrf.enable()) // ✅ включено
19 .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
20 return http.build();
21}

bug2regressРегрессионный тест

Тест шлёт POST без csrf-токена. Если сервер всё ещё отвечает 200 — стопаем билд. Ожидаем 403.

#!/bin/bash
# csrf-check.sh
STATUS=$(curl -s -o /tmp/resp.json -w "%{http_code}" \
  -X POST \
  -b "SESSION=fake-user-session-cookie" \
  -d "newEmail=hacker@evil.example" \
  https://staging.example.internal/user/email/update)

if [ "$STATUS" = "200" ]; then
  echo "[BLOCK] CSRF: можно менять данные без CSRF-токена"
  exit 1
fi

echo "[OK] Сервер требует CSRF-токен (HTTP $STATUS)"
exit 0

Это делает невозможной тихую подмену пользовательских настроек через внешние сайты.

Проверка пониманияЧто было не так?

Стандарт:любые state-changing запросы требуют CSRF-токен. Отключать CSRF «чтобы не мешал фронту» нельзя.

Теория (по желанию) CSRF = «мы заставили пользователя нажать кнопку, не спрашивая его»