본문 바로가기

Security

[Webhacking] CSRF (cross site request forgery)

반응형

웹 브라우저는 기본적으로 Same Origin Policy에 위반되지 않은 모든 요청에 쿠키 포함해 전송함.

비정상적으로 사용자의 의도와 무관하게 다른 사이트에 HTTP 요청 보내는 것을 CSRF 공격이라 한다.

 

CSRF 공격을 통해 공격자는 해당 세션 쿠키를 가진 사람만 사용할 수 있는 기능을 요청할 수 있음.

권한을 갖고 있는 사용자가 의도하지 않은 요청을 보내서 이득취할 수 있음.

  • 금액을 송금하게 하기.
  • 사용자 패스워드를 변경하기.
  • 관리자 권한으로 공지사항 작성.

 

CSRF 공격을 위한 두 가지 조건

  1. 해당 웹 사이트가 쿠키를 이용한 인증 방식을 사용. (세션 아이디가 쿠키에 저장)
  2. 공격자가 사전에 사전에 알 수 없는 파라미터가 존재해서는 안됨.
    • 자동 입력 방지 문자를 넣어야 하는 요청은 공격자가 미리 알 수 없음.
    • 패스워드 변경 시에 기존 패스워드를 입력 받는다면 공격자가 알 수 없음.

세션 쿠키의 세션 키 값을 통해 사용자 검증.

이 값을 탈취한 후에 파라미터에 값을 입력하여 요청 수행.

게시판에서 아래와 같은 스크립트를 내용에 입력해서 게시물을 작성.

<img src="/sendmoney?to=dreamhack&amount=1337">
<img src=1 onerror="fetch('/sendmoney?to=dreamhack&amount=1337');">
<link rel="stylesheet" href="/sendmoney?to=dreamhack&amount=1337">

 

이 게시물에 접근한 사람은 내용에 삽입된 script가 자신의 브라우저에서 실행되면서 송금하게 됨.

 

이미지를 띄우기 위해 해당 src로 request하게 되고 로그인된 사용자는 세션 쿠키를 통해 인증이 되어있으므로

추가 인증없이 자동 실행됨.

하지만 이 sendmoney 단계에서 자동 방지 입력을 받는다면 사용자가 눈치채고 송금을 중지할 수 있음.

 

Mitigation

CSRP 공격 방지를 위한 방법.

  1. 세션 쿠키 대신 커스텀 헤더를 사용하여 사용자 인증 (ex : Authorization)
  2. 공격자가 예측할 수 없는 파라미터 추가 및 검증
    • Same Origin에서만 접근 가능한 데이터 삽입 (CSRF Token)
    • CAPTCHA
    • 정상적인 사용자만 알고 있는 값으로 추가 검증 (현재 비밀번호)

위 방식은 서버 사이드에서 추가적인 검증을 하는 방법이므로 어쩔 수 없는 오버헤드 발생.

CSRF가 가능한 이유는 웹 브라우저가 다른 사이트(Cross site)로 요청 시에도 쿠키를 함께 전송하기 때문.

 

웹 브라우저는 다른 사이트로부터 온 요청에 쿠키를 삽입할지를 SameSite 쿠키 설정을 보고 판단.

SameSite 옵션에는 (Strict, Lax , Normal) 값이 존재.

  • Strict는 모든 크로스 사이트 요청에 쿠키 삽입하지 않음.
  • Normal은 모든 요청에 삽입.
  • Lax는 Link, Prerender, Form GET을 제외한 요청에는 쿠키를 삽입하지 않음.

크롬은 default로 Lax 강제함.

반응형

'Security' 카테고리의 다른 글

[Webhacking] click jacking  (0) 2021.09.19
[Webhacking] open redirect  (0) 2021.09.19
[Webhacking] XSS (cross site scripting)  (0) 2021.09.19
[Webhacking] client-side basic  (0) 2021.09.17
[wargame] strcmp  (0) 2021.09.17