가. 취약점 개요
공격자는 세션탈취, XSS 등으로 자신이 의도한 행위(수정, 삭제, 등록 등)를 사이트가 신뢰하는 인증된 사용자의 권한으로 실행되게 할 수 있다.
나. 설계시 고려사항
① 시스템으로 전송되는 모든 요청에 대해 정상적인 사용자의 유효한 요청인지, 아닌지 여부를 판별할 수 있도록 해야 한다.
(ㄱ) CSRF 토큰 사용
웹은 URL기반으로 요청을 처리하는 구조이다. 해당 요청이 특정 사용자의 정상적인 요청인지를 구분하기 위한 정책이 적용되지 않는 경우, 스크립트나 자동화된 도구에 의해 보내지는 요청이 검증절차 없이 처리될 수 있다.
그래서 해당 요청이 정상적인 사용자의 정상적인 절차에 의한 요청인지를 구분하기 위해 세션별로 CSRF 토큰을 생성하여 세션에 저장하고, 사용자가 작업페이지를 요청할 때마다 hidden값으로 클라이언트에게 토큰을 전달한 뒤, 해당 클라이언트의 데이터처리 요청 시 전달되는 CSRF 토큰값 과 세션에 저장된 토큰값을 비교하여 유효성을 검사하도록 설계한다.
CSRF 토큰값에 대한 검사 방법은 MVC프레임워크의 컴포넌트를 이용하여 데이터 처리 요청 수신 시 자동으로 검사될 수 있도록 설계한다. Spring이나 Struts와 같은 MVC프레임워크의 경우 사용자의 요청을 중간 에 가로채서 값의 유효성을 검사할 수 있는 Interceptor 컴포넌트를 이용 하여 파라미터로 전달된 CSRF 토큰값이 세션에 저장된 토큰값과 동일한지를 검사하여 동일한 경우만 요청이 처리될 수 있도록 설계한다.
(ㄴ) 사용자와 상호 처리 기능 적용
CSRF 토큰 방식도 XSS 취약점이 있는 사이트를 공격하게 되면 무력화될 수 있으므로 CAPTCHA와 같은 사용자와 상호 처리 가능한 기법을 적용하여 위조된 요청이 차단될 수 있도록 설계한다.
(ㄷ) 재인증 요구
중요기능의 경우 재인증으로 안전하게 실제 요청 여부를 확인하도록 설계한다.
[테스트 문제]
문제: 세션별로 CSRF 토큰을 생성하여 세션에 저장하고, 사용자가 작업페이지를 요청할 때마다 hidden값으로 서버에게 토큰을 전달한 뒤, 해당 서버의 데이터처리 요청 시 전달되는 CSRF 토큰값 과 세션에 저장된 토큰값을 비교하여 유효성을 검사하도록 설계한다.
정답: X
해설: 세션별로 CSRF 토큰을 생성하여 세션에 저장하고, 사용자가 작업페이지를 요청할 때마다 hidden값으로 클라이언트에게 토큰을 전달한 뒤, 해당 클라이언트의 데이터처리 요청 시 전달되는 CSRF 토큰값 과 세션에 저장된 토큰값을 비교하여 유효성을 검사하도록 설계한다.
문제: 보안대책을 서술하시오.
정답:
1. CSRF토큰 적용
2. 캡차 적용
3. 재인증 요구
문제: 빈칸을 채우시오.
① 시스템으로 전송되는 모든 요청에 대해 정상적인 사용자의 유효한 요청인지, 아닌지 여부를 판별할 수 있도록 해야 한다.
1. (ㄱ) 사용
웹은 URL기반으로 요청을 처리하는 구조이다. 해당 요청이 특정 사용자의 정상적인 요청인지를 구분하기 위한 정책이 적용되지 않는 경우, 스크립트나 자동화된 도구에 의해 보내지는 요청이 검증절차 없이 처리될 수 있다.
그래서 해당 요청이 정상적인 사용자의 정상적인 절차에 의한 요청인지를 구분하기 위해 세션별로 (ㄱ)을 생성하여 세션에 저장하고, 사용자가 작업페이지를 요청할 때마다 hidden값으로 (ㄴ)에게 토큰을 전달한 뒤, 해당 (ㄴ)의 데이터처리 요청 시 전달되는 CSRF 토큰값 과 세션에 저장된 토큰값을 비교하여 유효성을 검사하도록 설계한다.
CSRF 토큰값에 대한 검사 방법은 MVC프레임워크의 컴포넌트를 이용하여 데이터 처리 요청 수신 시 자동으로 검사될 수 있도록 설계한다. Spring이나 Struts와 같은 MVC프레임워크의 경우 사용자의 요청을 중간 에 가로채서 값의 유효성을 검사할 수 있는 (ㄷ)를 이용 하여 파라미터로 전달된 CSRF 토큰값이 세션에 저장된 토큰값과 동일한지를 검사하여 동일한 경우만 요청이 처리될 수 있도록 설계한다.
2. 사용자와 상호 처리 기능 적용
CSRF 토큰 방식도 XSS 취약점이 있는 사이트를 공격하게 되면 무력화될 수 있으므로 (ㄹ)와 같은 사용자와 상호 처리 가능한 기법을 적용하여 위조된 요청이 차단될 수 있도록 설계한다.
3. (ㅁ) 요구
중요기능의 경우 (ㅁ)으로 안전하게 실제 요청 여부를 확인하도록 설계한다.
정답
ㄱ. CSRF 토큰
ㄴ. 클라이언트
ㄷ. Interceptor 컴포넌트
ㄹ. 캡차( CAPTCHA )
ㅁ. 재인증