본문 바로가기
Dev ::

웹취약점 크로스 사이트 요청 위조(CSRF)/CSRF 토큰이 없는 폼 태그(POST/GET)

by 히로:: 2024. 7. 31.

크로스 사이트 요청 위조(Cross-Site Request Forgery, CSRF)는 사용자가 인지하지 못한 상태에서 공격자가 특정 웹 애플리케이션에 악의적인 요청을 전송하게 하는 보안 취약점입니다. 사용자의 세션을 도용하거나, 권한이 부여된 사용자의 이름으로 악의적인 행동을 수행할 수 있게 합니다. 프로젝트 웹 취약점 검사 진행 시에 가장 흔하게 검출되는 유형이기도 합니다. 

 

CSRF의 원리

CSRF 공격은 사용자가 인증된 세션을 가지고 있을 때 발생합니다. 공격자는 사용자를 속여 자신의 웹사이트에 방문하게 하고, 그 사이트에서 피해자의 브라우저를 통해 악의적인 요청을 전송합니다. 이 요청은 사용자가 이미 로그인된 상태의 세션 쿠키를 사용하기 때문에, 서버는 이를 정상적인 요청으로 인식할 수 있습니다.

<form method="POST" action="http://csrf공격이다.com">
  <input type="hidden" name="amount" value="1000">
  <input type="hidden" name="to_account" value="attacker_account">
  <input type="submit" value="Submit">
</form>

 

위 소스코드는 실제로 동작하진 않지만, CSRF공격의 간단한 예시로 사용자가 로그인된 상태에서 악의적인 사이트를 방문했을 때, 피해자의 계정에서 공격자의 계정으로 금액을 전송하게 만들 수 있습니다. 

 

CSRF 방어 기법: CSRF 토큰

CSRF 공격을 방어하기 위한 가장 일반적인 방법은 CSRF 토큰을 사용하는 것입니다.

CSRF 토큰은 서버가 생성하여 폼에 포함시키고, 폼이 제출될 때(submit) 해당 토큰을 검증함으로써 요청이 정당한지 확인하는 방법입니다.

 

이해되셨나요?? 

 

서버 즉, 백엔드에서 CSRF 토큰을 생성하고, 폼이 제출(submit)될 때 해당 토큰을 같이 전달하여 서버에서 생성된 토큰과 다시 비교를 하는 방법입니다. 

<form method="POST" action="폼전송URL">
  <input type="hidden" name="amount" value="1000">
  <input type="hidden" name="to_account" value="recipient_account">
  <input type="hidden" name="csrf_token" value="unique_token_value">
  <input type="submit" value="Submit">
</form>

 

CSRF 토큰이 없는 폼 태그의 위험성

CSRF 토큰이 없는 폼 태그는 매우 위험합니다. 이는 공격자가 손쉽게 CSRF 공격을 성공시킬 수 있게 합니다. 

모든 중요한 폼에는 반드시 CSRF 토큰을 포함시켜야 하며, 서버는 이를 검증하여야 합니다.

 

 

모든 폼(form)태그에  CSRF 토큰을 사용해야 할까?

자! 그럼 여기서 '모든 중요한 폼'이 중요합니다. 

 

개발을 하다보면 폼(form) 태그를 많이 사용하실 겁니다. 폼에는 전송방식으로(method) POST방식과 GET방식이 있습니다. 

POST방식은 데이터를 전송할 때, 서버의 상태를 변경할 때 주로 사용하고 GET방식은 일반적으로 서버의 상태를 변경하지 않으며 데이터를 조회하는 데 사용합니다. 예를 들면 주로 게시판 상단의 검색 영역에는 GET방식의 폼태그를 많이 사용하죠. 

 

서버의 상태를 변경하지 않고, 데이터를 조회하는 데 사용하는 GET요청의 경우 CSRF(Cross-Site Request Forgery) 보호가 기본적으로 필요하지 않습니다. 

 

이는 여러 보안 가이드라인과 자료에서 확인할 수 있는 내용입니다. (하단 출처확인)

 

 

 

CSRF는 매우 위험한 웹 취약점 중 하나로, 이를 방어하기 위해서는 POST 요청 폼에 CSRF 토큰을 반드시 사용해야 합니다. 웹 애플리케이션을 개발할 때, 중요한 데이터 변조가 가능한 모든 POST 요청 폼에 CSRF 토큰을 포함시키고, 서버에서 이를 검증하는 절차를 잊지 말아야 합니다.

 

 


 

출처

  1. OWASP: GET 요청은 데이터를 조회하는 데 사용되며, 서버의 상태를 변경하지 않아야 합니다. 따라서, GET 요청에는 CSRF 보호가 필요하지 않습니다. 이 원칙은 CSRF 공격을 방지하기 위한 중요한 보안 원칙 중 하나입니다 (OWASP) (OWASP Deteact)
  2. Information Security Stack Exchange: GET 요청은 상태를 변경해서는 안 되며, 주로 데이터를 조회하는 데 사용됩니다. 따라서 이러한 요청에는 CSRF 보호가 필요하지 않습니다. CSRF 보호는 주로 POST, PUT, DELETE와 같은 상태 변경 요청에 적용됩니다 (Information Security Stack Exchange) (Information Security Stack Exchange).
반응형

댓글