안녕하세요. 성조입니다.
이번 포스팅은 "사이트 간 요청 위조"라고 불리는 공격 기법인 CSRF(Cross-Site Request Forgery)에 대해서 정리해보려 합니다.
결론
- 1줄 결론 : CSRF는 사용자의 의도치 않은 요청을 통해 공격자가 원하는 동작을 수행하게 만드는 웹 앱 공격 기법이다.
- 2줄 결론 : CSRF는 웹 애플리케이션의 취약점을 이용한 공격으로, 사용자의 인증된 상태에서 악성 요청을 실행시킨다. 이를 통해 공격자는 사용자의 권한을 도용해 원하는 동작을 수행할 수 있게 된다.
CSRF(Cross-Site Request Forgery)이란?
CSRF(Cross-Site Request Forgery)는 웹 앱플리케이션의 취약점을 이용한 공격 방법 중 하나로, 사용자의 의도와는 무관하게 공격자가 조작한 요청(Request)을 통하여 서버로 전송하고, 사용자의 권한(인증 정보 : 쿠키, 세션 등)을 탈취하여 공격자가 무단으로 작업을 수행하게 만드는 공격이다.
CSRF 피해 유형
공격자는 사용자의 권한을 탈취하여 원하는 웹/앱의 기능을 실행시킬 수 있으며, 이 과정에서 탈취당한 사용자는 아래와 같은 종류의 피해들을 입을 수 있다.
[개인 정보 유출, 계정 접근 권한 도용, 금융 거래 피해, 악성 코드 감염, 기업 또는 조직의 피해]
개인 정보 유출 : 핸드폰 번호, 주소지, 나이, 직장 등을 훔쳐서 신원 도용, 스팸, 피싱 공격 등에 악용될 수 있으며, 피해 입게 되면 금전적 손실, 개인 정보 노출 등의 피해가 발생될 수 있다.
계정 접근 권한 도용 : 계정 삭제, 계정 포스팅 오용, 개인 정보 변경 등 다양한 피해가 있을 수 있으며, 이 피해 유형은 계정 주인의 명성에 악영향을 끼칠 수 있는 것이 연예인들이나, 공인이 계정 권한을 탈취당하는 경우. 사생활로 인한 많은 피해 사례를 받을 수 있는 문제가 있다.
금융 거래 피해 : 공격자가 사용자의 온라인 뱅킹 계정이나, 결제 수단을 도용하여 무단으로 금융 거래를 진행하는 경우가 존재한다. 금전적 손실을 입을 수 있으며, 소액 결제인 경우 파악을 늦게 하는 경우가 있을 수 있다.
악성 코드 감염 : 공격자는 사용자의 기기에 악성 코드를 설치하여 사용자의 활동을 감시하거나, 기기를 무력화 또는 성능 저하를 유발할 수 있으며, 핸드폰 카메라를 활용하는 경우가 존재할 수 있다. 기기를 복구하거나, 새 기기를 구입해야 할 수 있으며, 악성 코드 패턴의 경우 발견하기 쉽지 않기 때문에 주의해야 한다.
기업 또는 조직의 피해 : 사용자 즉, 공격의 피해자가 소속된 기업 또는 조직 내부의 정보를 도용하거나, 기업 시스템에 무단 접근하여 피해를 입힐 수 있다. 여기에 랜섬웨어가 추가되면서 모든 파일들을 암호화하여 기업에게 돈을 요구하는 경우가 존재할 수 있다. 이때 기업은 경제적 손실 또는 랜섬웨어 공격자가 기업 이미지에 손상을 입게 만들 수 있다.
CSRF(Cross-Site Request Forgery) 공격 예시와 종류
공격 예시 : 사용자가 웹 사이트에 로그인하여 인증 정보를 받고, 웹 사이트 내에서 활동하기 시작한다.
예를 들면 티스토리로 가정한다. 카카오톡은 하나의 계정을 활용해서 모든 계정들을 관리하는 체계이다. 티스토리에 접속하면 다른 카카오 서비스에 따로 요청 없이도 계정들을 인증할 수 있다.
다시. 공격자가 악성 코드가 삽입된 이메일, 웹 페이지 등을 클릭할 수 있도록 사용자를 유도한다.
사용자는 클릭하여 확인하는 순간 현재 컴퓨터 또는 디바이스에 인증된 정보들을 탈취당하게 된다. 공격자는 탈취한 내용을 이용하여 조작된 요청(Request)을 서버로 전송하고, 서버는 올바르게 온 요청(Request)을 올바르다고 판단하여 요청을 허락한다.
이 과정에서 사용자(피해자)도 서버도 문제가 있는지 인지하지 못한다. 아예 모르게 되거나, 피해 이후에 뒤늦게 알게 되는 경우가 많다.
공격 종류는 다음 같다.
GET 요청을 통한 공격, POST 요청을 통한 공격, AJAX를 이용한 공격 등이 있으며, GET 요청은 이미 사용자가 인증되어 있는 경우 로컬(본인 컴퓨터)에 저장된 인증 유형들을 탈취한다. POST 요청은 변조 사이트에 사용자의 정보를 보내게 만들어서 탈취한다. AJAX 요청의 경우 웹 페이지가 로드되는 즉시 사용자의 인증 정보를 이용한 요청 정보를 전송하는 방법이다.
CSRF(Cross-Site Request Forgery) 보안 조치
CSRF 토큰 사용 : 서버에서 생성한 임의의 문자열인 CSRF 토큰을 폼 데이터에 포함시켜 요청과 함께 보내고, 사용자가 응답할 수 있도록 한다. 서버는 사용자가 토큰을 제대로 답변했는지 검증하여 공격당하고 있는 것인지 판별한다.
SameSite 쿠키 : 웹 브라우저에서 SameSite 쿠키 속성을 지원하면, 요청이 다른 도메인에서 발생한 것인지 판별하여 CSRF 공격을 방어할 수 있다.
SameSite 쿠키는 보안을 강화하기 위해서 활용되는 웹 쿠키의 속성 중 하나이며, 이 쿠키는 웹 서버와 클라이언트 간의 상호 작용을 기록하고, 클라이언트가 다음 요청을 필요로 할 때 사용된다. SameSite 속성은 쿠키가 서로 다른 도메인에서 전송되지 않도록 하는 것이 중요 기능이며 다음과 같은 속성 값들을 가질 수 있다.
Strict : 현재 도메인에서만 전송되는 속성이다. 다른 도메인으로 전송하는 경우, 브라우저는 해당 쿠키를 무시한다.
Lax : 링크를 클릭하거나, 이미지나 프레임 등의 자원을 다운로드할 때만 다른 도메인으로 전송한다. 다른 방식으로 전송하려는 경우 해당 쿠키의 방법을 무시한다.
None : 속성이 적용되지 않은 일반적인 쿠키와 같이 모든 요청에 대해 전송한다. 하지만 None 값을 사용하기 위해서는 Secure 속성을 추가해야하며, Secure 속성이 추가 되어있지 않는 경우에는 무시한다.
사용자 인증 확인 : 은행 결제와 같이 중요한 작업을 수행할 때마다 사용자의 비밀번호를 다시 한 번 더 확인하여 공격을 방어하는 방법이다. OTP 같은 인증을 지속적으로 검증하여 사용자가 올바르게 인증을 처리하고 있는지 판별하는 방법이다. 이 사례는 은행이 아니면 사용성이 너무 떠러질 수 있는 단점이 있다.
올바르지 못한 내용이나, 궁금한 내용이 있다면 언제든지 댓글로 지식을 얘기해 주시면 감사드리겠습니다.
더 좋은 포스팅 작성해 보겠습니다.
다음 포스팅 때 뵙겠습니다.