설명
CSRF는 브라우저가 쿠키 같은 인증 정보를 자동 전송하는 상황에서 공격자가 피해자의 의도와 다른 요청을 보내게 하는 공격입니다. 서버가 요청의 정당성을 확인하지 않으면 피해자의 권한으로 작업이 수행될 수 있습니다.
잠재적 영향
- 피해자의 권한으로 계정 설정이나 데이터를 변경할 수 있습니다.
- 중요한 기능이 노출되어 있으면 서비스 중단이나 권한 남용으로 이어질 수 있습니다.
- 정보 공개·전송 설정을 변경해 데이터가 노출될 수 있습니다. CSRF 자체가 응답 본문을 공격자에게 읽게 해 주는 것은 아닙니다.
해결 방법
- 프레임워크의 CSRF 방어를 사용하거나, 세션에 연결된 예측 불가능한 토큰을 발급하고 상태 변경 전에 검증하세요.
SameSite쿠키 속성은 추가 방어로 적용하되 토큰 검증을 대신한다고 가정하지 마세요.- CORS 정책과 요청 출처 검증을 검토하고, 중요한 작업에는 재인증 같은 추가 확인을 적용하세요.
예시
컨트롤러 메서드의 일부입니다. 다른 필터에서 이미 CSRF를 검증하는지 확인하세요. 변경 후 예시는 서버가 예측 불가능한 csrf_token을 발급해 세션과 폼에 안전하게 전달했다고 가정합니다.
변경 전
java
@PostMapping("/update")
public String updateData(HttpServletRequest request) {
String data = request.getParameter("data");
// 데이터를 업데이트하는 로직
return "updateSuccess";
}
변경 후
java
@PostMapping("/update")
public String updateData(@RequestParam("csrf_token") String csrfToken, HttpServletRequest request) {
String sessionCsrfToken = (String) request.getSession().getAttribute("csrf_token");
if (sessionCsrfToken == null || !sessionCsrfToken.equals(csrfToken)) {
throw new SecurityException("CSRF Token mismatch");
}
String data = request.getParameter("data");
// 데이터를 업데이트하는 로직
return "updateSuccess";
}
설명:
- 변경 전: 이 메서드에는 CSRF 검증이 없습니다. 다른 계층에서도 보호하지 않으면 쿠키 인증 요청이 악용될 수 있습니다.
- 변경 후: 요청 토큰과 세션 토큰이 일치하는지 확인한 뒤 작업합니다. 사용자 인증과 작업별 권한 검사는 별도로 필요합니다.
관련 CVE
- CVE-2004-1703: Add user accounts via a URL in an img tag
- CVE-2004-1995: Add user accounts via a URL in an img tag
- CVE-2004-1967: Arbitrary code execution by specifying the code in a crafted img tag or URL