티스토리 뷰

Security/보안 취약점

CSRF

0bliviat3 2025. 3. 20. 22:49

CSRF는 사용자가 신뢰하는 웹 애플리케이션에서 사용자 모르게 비정상적인 요청이 수행되도록 유도하는 공격을 말한다. 최근 소나큐브로 소스 정적분석을 돌려볼일이 있었는데 제일 많이 잡혔던 취약점이기도 하다.

사실 주안점은 비정상적인 요청인데 GET 요청을 기대하는 API가 있을때 POST요청등의 다른 HTTP 메서드로 요청이 가능하면 이 역시 CSRF 보안취약점으로 잡혀서 그렇다.

 

그럼 공격시나리오를 한번 살펴보며 자세히 알아보겠다.

 

 

시나리오

1. 사용자가 특정 서비스에 로그인(: 뱅킹 웹 사이트)

2. 공격자가 악의적인 링크 또는 스크립트를 피해자에게 보냄

3. 피해자가 로그인 상태로 링크를 클릭하면 브라우저는 자동으로 인증 쿠키를 포함해 요청을 전송

4. 공격자는 피해자 계정에서 임의의 작업을 수행 (송금 정보 변경등)

 

 

대책

SecurityFilterChain에서 CSRF 설정을 해주고

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .csrf(csrf -> csrf
            .csrfTokenRepository(csrfTokenRepository())
            )
            .authorizeHttpRequests(auth -> auth
                .anyRequest().permitAll()
        );
    return http.build();
}

 

폼을 사용하는 화면에서는 CSRF 토큰을 추가한다.

 

<!-- CSRF 토큰 추가 -->
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>

 

그리고 CSRF 검증로직을 추가해준다.

// CSRF 토큰 직접 검증
CsrfToken csrfToken = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
if (csrfToken == null || !csrfToken.getToken().equals(_csrf)) {
    return "redirect:/vulnerable/csrf/create?error=invalid_csrf";
}

 

요청시 전달되는 CSRF 토큰값의 검증을 통해 방어가 가능하다.

'Security > 보안 취약점' 카테고리의 다른 글

HTTP응답 분할  (0) 2025.03.23
경로 조작  (0) 2025.03.19
Template Injection (feat. XSS)  (0) 2025.03.18
SQL Injection  (0) 2025.03.17
보안 아키텍처  (0) 2025.03.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함