CSRF

DOUIK·2022년 7월 16일

개념

목록 보기
1/3

Cross-Site Request Forgery (CSRF)

  • 신뢰할 수 있는 사용자를 가장해서 웹 사이트에 원치 않는 명령을 보내는 공격
  • 원 클릭 공격 또는 세션 라이딩이라고도 한다.
  • XSS와의 차이점은 XSS는 사용자가 특정 웹 사이트를 신용하는 점을 노린 것이라면, 사이트간 요청 위조는 특정 웹 사이트가 사용자의 웹 브라우저를 신용하는 상태를 노린것
    • XSS는 공격 대상이 클라이언트라면 CSRF는 공격 대상이 서버임
  • 사용자와 웹 간에 통신 할 때 Request와 Response를 분석해서 Request(요청)을 위조해 공격자가 원하는 행위를 하게 하는 공격
  • 예를 들어 회원 정보 변경, 데이터 수정/삭제, 게시글 내용 변경 등을 할 수 있다.
  • 악성 스크립트가 아니더라도 공격이 가능하다.

CSRF 방지법

  1. 위조 방지 토큰 사용
  • 특정 권한이 필요한 페이지는 해당 페이지와 실제 동작이 일어나는 페이지 사이에 토큰을 생성해서 그 값을 비교해 토큰이 존재하지 않거나 다른 경우 동작을 허용하지 않음
  1. Referer 값 이용
  • 프록시 툴, 패킷 등을 통해 확인하면 다른 페이지로 이동할 경우 그 전 페이지 정보를 가지고 이동하는데 이때 전 페이지 정보가 없거나, 외부 사이트에서 요청한 경우 요청을 처리하지 않음
  • Paros, Zap, fiddler 같은 프로그램으로 조작 가능해서 권장하지 않음
  1. Captcha 이용
  • 회원정보 변경, 게시글 작성 등 CSRF 공격을 막아야 하는 페이지에서 캡챠를 사용해 인증이 가능한 것만 요청을 처리해주는 방법

위조 방지 토큰(Anti-Forgery Tokens)

  • 요청 검증 토큰(Request Verification Tokens)이라고 부르기도 함
  1. 클라이언트가 폼이 존재하는 HTML 페이지를 요청함
  2. 서버는 응답에 두 가지 토큰을 포함시켜 반환함. 그 중, 한 가지 토큰은 쿠키를 통해서 전송됨. 그리고 다른 토큰은 숨겨진 폼 필드에 담겨짐. 이 토큰들은 사용자들이 값을 추측할 수 없도록 무작위로 생성됨
  3. 클라이언트가 폼을 제출할 때, 두 가지 토큰이 모두 서버로 재전송돼야 함. 클라이언트는 쿠키 토큰은 쿠키를 통해서 전송하고, 폼 토큰은 폼 데이터에 담아서 전송함(브라우저가 사용자 폼을 제출할 때 자동으로 이 작업을 처리해줌)
  4. 두 토큰 중 하나라도 일치하지 않으면 서버가 해당 요청을 허용하지 않음.

🔉 위조 방지 토큰으로 CSRF 공격을 방지할 수 있는 이유는 Same Origin 정책에 따라 악의적인 페이지에서 사용자의 토큰을 읽을 수 없기 때문임.

사용자가 로그인 한 이후에 브라우저가 내부적으로 자격 증명을 전송하는 모든 인증 프로토콜들은 위조 방지 토큰을 사용해야만 CSRF 공격을 방지할 수 있음. 그 대상에는 폼 인증 같은 쿠키 기반 프로토콜 인증 뿐 아니라 기본 인증이나 다이제스트 인증도 포함됨

또한, 모든 안전하지 않은 메소드들(PUT, POST, DELETE)에 위조 방지 토큰을 적용해야 함. 안전한 메서드들(GET, HEAD)도 부작용을 일으키지 않는지 확인해야 함. 더군다나 CORS나 JSONP같은 크로스 도메인 지원을 활성화 시켰다면 GET 같은 안전한 메소드조차도 잠재적으로 CSRF 공격에 취약점을 갖게되므로 공격자가 내부적으로 민감한 데이터를 읽을 수 있게 됨

CORS(Cross-Origin Resource Sharing)

  • 추가적인 HTTP 헤더를 사용해서 한 출처에서 실행중인 웹 어플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 정책
  • 리소스가 자신의 출처(도메인, 프로토콜, 포트)와 다를 때 교차 출처 HTTP 요청을 실행함

리소스 공유 방법

  • postMessage
    메시지를 주고받기 위한 이벤트 핸들러를 이용해 리소스를 공유함
  • JSONP
    스크립트 태그를 통해 외부 자바스크립트 코드를 호출하면 현재 오리진에서 해당 코드가 실행된다는 점을 이용한 방법. 스크립트 태그를 통해 다른 오리진의 리소스를 요청하고, 응답 데이터를 현재 오리진의 Callback 함수에서 다루는 방식으로 리소스를 공유함
  • Cross Origin Resource Sharing(CORS) 헤더 사용
    다른 오리진이 허용하는 설정 등을 HTTP 헤더를 통해 확인한 후 허용하는 요청을 보내 리소스 공유

참고

0개의 댓글