새소식

security

[Security] XSS와 CSRF 공격

  • -

XSS와 CSRF 공격

XSS(Cross-Site-Scripting) 공격

XSS는 Cross-Site-Scripting의 약자로 게시판이나 웹 메일 등에 스크립트 코드를 삽입하여 개발자가 고려하지 않은 기능이 작동하게 하는 공격을 말한다.

XSS 공격을 통해 공격자는 다른 이용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조 등의 공격을 할 수 있다.

XSS 공격 유형

XSS 공격은 저장형(stored)과 반사형(reflected)이 존재한다.

저장형은 사용자가 보는 게시물에 악성 스크립트를 삽입하여, 이를 열람할 경우, 공격자의 스크립트가 실행되도록 한다. 공격자는 이를 통해 열람한 유저의 쿠키, 세션 등의 정보를 획득할 수 있다.

반사형은 URL에 스크립트 코드를 작성하는 것이다. 특정 링크를 클릭하면, 링크 URL에 삽입된 스크립트가 실행되며 웹 페이지의 내용이 변경된다.

XSS 방어

입출력 값 검증

대부분의 XSS 공격은 사용자의 입력에 대한 검증이 없기 때문에 발생한다.
사용자가 입력한 값을 그대로 출력할 때 검증이 필요하다.
XSS Cheat Sheet에 대한 필터 목록을 만들어 모든 Cheat Sheet에 대한 대응이 가능하도록 해야한다.
XSS에 대한 필터링을 적용한 뒤 직접 테스트하여 스크립트가 실행되는지 모의 해킹해보는 것도 좋은 방법이다.

XSS 특수문자 치환

XSS 공격 방지를 위해 XSS 공격에서 사용하는 아래와 같은 특수문자를 치환시키는 과정이 필요하다.

from & < > " ' /
to &amp &lt &gt &quot &#x27 &#x2F

HttpOnly Cookie 사용

LocalStorage와 일반적인 쿠키는 스크립트를 통해 값에 접근할 수 있다. 이 경우, Session Hijacking에 취약해진다.
LocalStorage와 일반 쿠키에는 민감한 정보를 두지 않고, 민감한 정보가 들어있는 쿠키의 경우 HttpOnly 옵션을 주게되면 스크립트로 쿠키에 접근할 수 없다.
HttpOnly 쿠키를 통해 SessionId, Token 등이 탈취 당하는 것을 방지할 수 있다.

CSRF(Cross-Site-Request-Forgery) 공격

CSRF는 Cross-Site-Request-Forgery의 약자로 다른 사이트에서의 변조된 요청을 말한다.
CSRF 공격은 공격자가 피해자의 권한으로 특정 행위를 하도록 인자값들을 구성해서 피해자가 본인도 모르게 본인의 권한으로 해당 사이트에 요청을 보내도록 하는 공격이다.

공격자는 다른 사이트에 있기 때문에 응답 객체에 담긴 정보 자체를 탈취할 수는 없다. 따라서 요청을 조작해서 의도하지 않은 요청을 보내도록 한다.

CSRF 공격이 이루어지기 위한 조건

  1. 쿠키를 기반으로 한 세션 인증
    • 조작된 요청에는 브라우저에 저장된 쿠키가 함께 전송된다. 조작된 요청과 함께 전송된 쿠키를 기반으로 서버에서 유저를 인증할 수 있어야 한다.
  2. 예측가능한 불가능한 요청 파라미터가 존재해서는 안됨
    • 요청에 필요한 파라미터들을 공격자가 알고 있어야 요청을 조작할 수 있다.

CSRF 방어

CSRF 공격을 방어하기 위해서 다음과 같은 방법들을 이용할 수 있다.

CSRF 토큰 사용

보편적으로 사용되는 방법 중 하나로 사용자가 요청한 페이지에 사용자의 세션과 연결된 랜덤값을 생성해서 넣어두고, 나중에 오는 요청에 해당 랜덤값이 원본과 일치하는지 검사해서 일치할 경우에만 요청에 대한 처리를 수행하도록 하는 방법이다.

CSRF 토큰은 예측 불가능한 랜덤값이기 때문에 공격자가 미리 값을 넣어둘 수 없다.
이를 사용하면 CSRF 공격이 이루어지기 위한 조건의 2번 예측 불가능한 요청 파라미터가 존재하게 되므로 CSRF 공격을 어느정도 방지할 수 있다.
만약 CSRF 공격을 받는 곳에서 XSS 취약점이 있다면, 공격자의 스크립트를 실행시킬 수 있기 때문에 서버에 요청을 보내 CSRF 토큰을 미리 받아와 공격 코드에 포함시킬 수 있다.

Referer 헤더 검증

요청의 Referer 헤더는 웹 요청시 현재 요청이 발생한 페이지의 URL을 담아서 보낸다.
서버에서는 Referer 헤더를 검사하여 지정한 헤더에서 왔는지, 또는 호스트와 Referer 값이 일치하는지 비교하여 조건을 만족하지 않으면 요청을 거절하는 방식으로 방어할 수 있다.
이 방법 역시 XSS 취약점이 존재한다면, Referer 헤더를 변조할 수 있다.

SameSite 쿠키

쿠키에 SameSite 옵션을 추가하여 같은 사이트로의 요청이 아닐 때 쿠키를 요청에 포함시킬지 시키지 않을 지 지정할 수 있다.
부여할 수 있는 SameSite 옵션은 다음과 같다.

  • Lax : 동일한 사이트 내의 요청 및 다른 사이트의 GET 요청으로 전송. 도메인 간 GET 요청으로는 전송되지 않음.
  • Strict : 쿠키가 동일한 사이트 내의 요청으로만 전송됨.
  • None : SameSite 옵션을 사용하지 않음(https에서만 적용됨).

쿠키의 SameSite 속성을 잘 이용하면 CSRF를 효율적으로 방어할 수 있다.

주의
SameSite=Lax 옵션이 부여될 경우, 예외적으로 form 태그를 이용한 POST 요청에서는 cross-site일 경우에도 쿠키가 전송된다.

CAPTCHA

그림에 나와있는 문자를 입력하거나, "로봇이 아닙니다" 등의 체크박스를 체크하는 방식으로 해당 요청이 봇에 의한 요청이 아님을 검증하는 기술이다.

2차 인증

요청을 받을 때, 사용자만 알고있는 정보를 함께 입력받도록 하거나 추가 인증 등을 통해 공격자가 예측할 수 없는 값을 만들어 CSRF 공격을 방어할 수 있다.

'security' 카테고리의 다른 글

[Security] CORS  (0) 2022.11.29
[Security] XSS와 CSRF 공격

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.