ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CSRF(Cross Site Request Forgery)
    CS 2024. 7. 15. 18:33

    인터넷의 발전으로 웹 페이지 사용자가 급증하는 시대에, 보안은 매우 중요한 요소 중에 하나이다.

    그렇기에 안전한 사이트를 만들기 위해서는 보안에 대한 공부가 필수적이게 되었다.

     

    여러 보안 문제들 중에 CSRF에 대해서 자세하게 알아보도록 하자.

     

    ❓ CSRF(Cross Site Request Forgery)

    CSRF는 사이트간 요청 위조라는 의미로 웹 보안 취약점의 일종이다.

     

    인터넷을 사용하면서 웹 페이지에 요청을 보내는 경우가 대다수 일어나는데, 이때 사용자의 의도와는 다르게 공격자가 의도한 데이터 수정 및 삭제, 등록 등을 특정 웹사이트에 요청하는 공격이다.

     

    예를 들어, 공격자가 신뢰할 수 있는 사용자의 계정으로 유해한 게시물을 업로드 하는 경우를 예로 들 수 있다.

     

    🚨 CSRF 동작원리

    CSRF는 일반적으로 우리가 생각하는 해킹인 사용자의 컴퓨터를 감염시키거나 사이트의 서버를 해킹하는 것이 아니다.

     

    CSRF를 통해 공격을 하기 위해서는 다음과 같은 조건이 만족되어야 한다.

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

    두 조건에 대한 예시를 들어보자면, 우리가 일반적으로 일상에서 많이 방문하게 되는 유용한 사이트의 경우엔 우리가 "자동 로그인"을 해놓고 사용하는 경우가 많고, 피싱 사이트 같은 경우 피싱 이메일 또는 음란 사이트 등을 통해서 접속될 수 있다. 

    또한, 사용자가 공격자가 만든 피싱 사이트에 접속하지 않더라도, XSS 공격을 성공한 일반적인 사이트를 통해 CSRF 공격이 수행될 수도 있다.

     

    정말 일반적으로 사용되는 CSRF 공격방법은 공격자가 특정 사이트의 인증 관련 취약점을 찾고, 해당 사이트에 취약점을 이용하여 공개된 게시판이나 메일 등을 통해 사용자가 해당 링크를 열게 만들어서 공격을 하는 것이다.

     

    잘 이해가 안 될 수 있으니 더 간단하게 설명하면,

    alswlfjddl.com이라는 어떠한 사이트의 비밀번호 변경 페이지 주소 패턴이 alswlfjddl.com/user.do?cmd=user_pwd_change&user=admin&newPwd=1111라고 한다면, 이러한 링크를 사용자의 메일에 XSS 형태로 전송하고 해당 메일을 읽도록 하게만 한다면 사용자의 패스워드는 바로 1111로 변경되는 것이다. 이렇게 되면 일반계정을 관리자 계정으로 전환하는 등의 일은 매우 쉬워지고, 그렇게 되면 해당 사이트의 정보는 모두 해킹 당할 수 있다.

     

    또한 img에도 GET 메소드를 통해 보내는 것이기에 악용될 수 있다. 

    <img src="https://alswlfjddl.com/logout" />

     

    대부분의 페이지들은 img를 필터링하지 못하므로, 위와 같은 코드를 넣어주면 해당 문서를 조회하려고 할 때마다 로그아웃이 되는데, 이는 대부분의 사이트에서 문제가 되고 있다.

     

    방어 기법

    일반적으로 CSRF 공격/방어는 HTTP GET 요청 방식에는 방어 대상에 두지 않고 주로 쓰기/변경이 가능이 가능한 POST, PATCH, DELETE 방식에만 적용하면 된다. 물론 중요한 데이터 조회나 GET으로 쓰기 및 변경을 하는 경우 방어가 필수적이다.

     

    Referer

    백엔드에서 request의 Referer를 확인하며 domain이 일치하는지 검증하는 방법이다.

     

    일반적으로 Referer 검증만으로 대부분의 CSRF 공격을 방어할 수 있다고 한다. 하지만 동일한 도메인 내의 페이지에 XSS 취약점이 있는 경우 CSRF 공격에 취약해질 수 있다. 

     

    domain 단위 검증에서 세밀하게 페이지 단위까지 일치하는지 검증을 하면 도메인 내 타 페이지에서 XSS 취약점에 의한 CSRF 공격을 방어할 수 있다.

     

    Security Token 사용

    Referrer 검증이 불가한 환경에서는 Secruity Token을 사용하면 된다.

     

    사용자의 세션에 임의의 난수 값을 저장한 후 사용자의 요청마다 해당 난수 값을 포함하여 전송한다.

    백엔드에서 요청이 들어올 때마다 세션에 저장된 토큰 값과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증하는 방법이다.

     

    하지만 이 방법 또한 같은 도메인 내에서의 XSS 취약점이 존재한다면 CSRF 공격에 취약해진다는 문제가 있다.

    'CS' 카테고리의 다른 글

    Web Layout (flex와 grid)  (0) 2024.07.29
    XSS(Cross Site Scripting)  (1) 2024.07.15
    브라우저 Reflow과 Repaint  (0) 2024.07.09
    브라우저 렌더링 과정  (0) 2024.07.03
    TCP vs HTTP  (0) 2024.06.22
Designed by Tistory.