CSRF 공격이란?

|

개인적인 연습 내용을 정리한 글입니다.
잘못된 내용이 있다면 편하게 댓글 남겨주세요!


CSRF

CSRF(Cross Site Request Forgery) 공격이란 웹 어플리케이션 취약점 중 하나로 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만든는 공격이다.

이러한 CSRF를 통해 해커는 희생자의 권한을 도용해 중요 기능을 실행하는 것이 가능핟. 그치만 CSRF는 해커가 사용자의 컴퓨터를 감염시키거나 서버를 해킹해서 이뤄지는 공격은 아니다. 이러한 CSRF 공격이 이루어지려면 다음 조건이 만족되어야 한다.

  • 위조 요청을 전송하는 서비스에 희생자가 로그인한 상태
  • 희생자가 해커가 만든 피싱 사이트에 접속

이 두 조건을 모두 충족시키기는 어려워보이지만, 사실 그렇지도 않다. 예로들어 페이스북, 로그인과 같은 사이트에는 우리가 보통 자동 로그인을 해놓는 경우가 많다. 이렇게 자동 로그인이 되어있는 상태에서 해커가 만든 피싱사이트(메인, 음란 사이트 등)를 통해 접속을 하기만 하면 공격이 이루어지는 것이다. 또 사용자가 해커가 만든 피싱 사이트를 접속하지 않더라도 해커가 XSS 공격을 성공한 정상 사이트를 통해 CSRF 공격이 수행될 수도 있다.

CSRF 공격 방어

  • Referrer 검증
  • Security Token 사용(CSRF_token)

일반적으로 CSRF 공격 방어는 조회성 (HTTP GET Method) 데이터에는 방어 대상에 두지않고, 쓰기/변경이 가능한 POST, PATCH, DELETE Method에만 적용하면 된다. 물론 정말 중요한 데이터를 조회하거나 GET을 통해 쓰기/변경 등의 동작을 한다면 Get Method에도 방어를 해야할 수도 있다.

Referrer 검증

Back-end 단에서 request의 referrer을 확인하여 domain 이 일치하는 지 검증하는 방법이다.

일반적으로 referrer검증만으로 대부분의 CSRF 공격을 방어할 수 있다. 하지만 같은 도메인 내의 페이지에 XSS 취약점이 있는 경우는 CSRF 공격에 취약해질 수 있다. domain 단위 검증에서 좀 더 세밀하게 페이지 단위까지 일치하는 지 검증을 하면 도메인 내의 타 페이지에서의 XSS 취약점에 의한 CSRF 공격을 방어할 수 있다.

CSRF 토큰

Referrer 검증이 불가한 환경이라면, Security Token을 활용할 수 있다. 우선 사용자의 세션에 임의의 난수값을 저장하고 사용자의 요청마다 해당 난수 값을 포함시켜 전송한다. 이후 Back-end 단에서 요청을 받을 때마다 세션에 저장된 토큰값과 요청 파라미터에 전달되는 토큰값이 일치하는 지 검증한다. 이 방법 또한 같은 도메인 내에 XSS 취약점이 있다면 CSRF 공격에 취약해 진다.


<form>
    {% csrf_token %}
    <input type="text" name="text"/>
    <input type="submit" value="확인"/>
</form>

Django 에서는 자체적인 템플릿을 통해 {% csrf_token %}이라고 form에 넣는 것만으로도 토큰을 주고받을 수 있도록 쉽게 사용이 가능하다.

클라이언트에서 해당 페이지를 접속하게 되면 Django에서 자동으로 csrf 토큰을 클라이언트로 보내어 cookie에 저장하고, POST로 전송할 때 cookie의 csrf 토큰이 함께 전송되어 인증하는 방식이다.


XSS 공격이란?

XSS(Cross-site Scripting)는 웹 상에서 가장 기초적인 취약점 공격방법의 일종으로, 악의적인 사용자(권한이 없는 사용)가 공격하려는 사이트에 스크립트를 넣는 기법을 말한다. 공격에 성공하면 사이트에 접속한 사용자는 삽욉된 코드를 실행하게 되며, 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다. (대부분 자바스크립트를 사용하여 공격하는 경우가 많다.)

공격 방법이 단순하고 가장 기초적이지만, 많은 웹사이트들이 XSS에 대한 방버조치를 해두지 않아 공격을 받는 경우가 많다. 여러 사용자가 접근 가능한 게시판 등에 코드를 삽입하는 경우도 많으며, 경우에 따라서는 메일과 같은 매체를 통해서도 전파가 된다.

XSS 공격은 주로 CSRF 공격을 하기 위해 사용되기 때문에 혼동되기가 쉬운데, CSRF는 특정한 행동을 시키는 것이고 XSS는 자바스크립트를 실행시키는 것으로 이해하면 된다.