<CSRF 이란?>
크로스 사이트 요청 위조(CSRF)는 사용자가 현재 인증된 웹 애플리케이션에서 원하지 않는 동작을 수행하도록 유도하는 공격 방식입니다. 공격자는 이메일이나 채팅을 통해 링크를 보내는 등 소셜 엔지니어링 기법을 활용하여 사용자를 속이고, 해당 웹 애플리케이션에서 공격자가 의도한 특정 작업을 실행하도록 할 수 있습니다.
이러한 공격은 브라우저가 자동으로 세션 쿠키나 기타 인증 정보를 요청에 포함시키는 특성을 악용하기 때문에, 타깃이 된 웹 애플리케이션은 사용자의 실제 의도와 공격자가 유도한 요청을 구별하기 어렵게 됩니다. 이러한 공격은 고객 관계 손상, 무단 자금 이체, 비밀번호 변경, 데이터 탈취(세션 쿠키 탈취 포함)와 같은 심각한 결과를 초래할 수 있습니다. CSRF 공격이 성공하면 공격자는 사용자의 계정을 무단으로 사용하거나, 중요한 데이터에 접근하여 민감한 정보를 악의적으로 활용할 수 있습니다.
<크로스 사이트 요청 위조(CSRF) 진행 방식>
다음은 CSRF 공격의 4단계를 설명하는 예시입니다 :
- 공격자는 실행될 경우 특정 은행 계좌에서 공격자의 계좌로 $10,000가 이체되는 위조된 요청을 만듭니다.
GET http://netbank.com/transfer.do?acct=PersonB&amount=$10000 HTTP/1.1 - 공격자는 이 위조된 요청을 하이퍼링크에 포함시키고 이를 대량 이메일에 첨부하거나 웹사이트에 임베드하여 배포합니다.
<a href="http://netbank.com/transfer.do?acct=AttackerA&amount=$10000">자세히 보기</a> - 피해자가 공격자가 배포한 이메일이나 웹사이트 링크를 클릭하면 피해자의 계좌에서 공격자 계좌로 $10,000가 이체되는 요청이 전송됩니다.
GET http://netbank.com/transfer.do?acct=AttackerA&amount=$10000 HTTP/1.1 - 은행 서버는 해당 요청을 받고 피해자가 인증된 사용자임을 인식하여 이 요청을 합법적인 것으로 간주하고 자금을 이체합니다.
이렇게 해서 공격자는 피해자의 인증된 세션을 악용하여 무단으로 계좌 이체를 수행하게 됩니다.
<CSRF 공격 조건들>
- 유의미한 액션: 공격자가 실행시키고 싶은 특정 동작이 애플리케이션에 존재해야 합니다.
- 쿠키 기반 세션 관리: 해당 동작이 하나 이상의 HTTP 요청을 발생시키며, 애플리케이션이 요청을 보낸 사용자를 식별하기 위해 오직 세션 쿠키만을 사용하는 경우입니다. 쿠키는 사용자의 세션을 유지하는 데 사용되며, 브라우저는 모든 요청에 대해 자동으로 쿠키를 포함하므로 공격자가 이를 악용할 수 있습니다.
- 예측 가능한 요청 파라미터: 공격자가 요청을 구성할 때 사용자가 필요한 정보 외에 추가적인 예측 불가능한 파라미터가 없어야 합니다.
<CSRF 공격 방법들>
- 사용자의 신원에 의존하는 웹사이트를 악용합니다. 공격자는 사용자가 해당 사이트에 이미 로그인되어 있거나 인증된 상태를 이용하여 공격을 시도합니다.
- 사용자의 브라우저를 속여 대상 사이트로 HTTP 요청을 전송하게 만듭니다. 피해자가 이를 인지하지 못한 상태에서 요청이 전송되므로 위험성이 큽니다.
- 부작용을 초래하는 HTTP 요청을 사용하며, 해당 요청에 대해 적절한 CSRF 보호가 없는 경우 공격에 취약합니다. CSRF 방어가 없는 경우, 요청이 성공하여 데이터 변조나 무단 거래와 같은 심각한 결과를 초래할 수 있습니다.
<CSRF 공격에 대한 방어 방법들>
- CSRF 토큰: CSRF 토큰은 서버 측 애플리케이션에서 생성되는 고유하고 비밀스러우며 예측할 수 없는 값으로, 클라이언트와 공유됩니다. 서버는 각 요청에 대해 이 토큰을 검증함으로써, 올바른 사용자로부터의 요청인지 확인하여 공격을 방지합니다.
- SameSite 쿠키: SameSite는 브라우저 보안 메커니즘으로, 다른 웹사이트에서 유래한 요청에 쿠키가 포함될 수 있는지 여부를 결정합니다.
- Referer 기반 검증: 일부 애플리케이션은 HTTP Referer 헤더를 사용하여 요청이 애플리케이션의 도메인에서 유래했는지 확인함으로써 CSRF 방어를 시도합니다.
- 사용하지 않을 때 웹 애플리케이션 로그아웃하기: 사용자가 애플리케이션을 사용하지 않을 때 세션을 종료하여 불필요한 위험을 줄이는 방법입니다.
- 사용자 이름 및 비밀번호 보안 유지: 자격 증명이 악의적인 접근으로부터 보호되도록 사용자 이름과 비밀번호를 안전하게 관리하는 것이 중요합니다.
- 브라우저에 비밀번호 기억 금지: 브라우저에 비밀번호를 저장하지 않으면, 공격자가 악의적으로 저장된 비밀번호에 접근할 가능성을 줄일 수 있습니다.
- 애플리케이션에 로그인된 상태에서 동시에 다른 사이트 탐색 지양: 한 애플리케이션에 로그인된 상태로 다른 사이트를 동시에 탐색하면 CSRF 공격의 위험이 높아지므로 피하는 것이 좋습니다.
참고 자료:
https://owasp.org/www-community/attacks/csrf
https://portswigger.net/web-security/csrf
https://www.cloudflare.com/learning/security/threats/cross-site-request-forgery/
https://www.imperva.com/learn/application-security/csrf-cross-site-request-forgery/
'웹 개발 (Frontend Developer) > 보안' 카테고리의 다른 글
XSS (Cross-Site Scripting) (1) | 2024.11.13 |
---|---|
동일 출처 정책 (Same-Origin Policy) & CORS (1) | 2024.11.12 |