FixVibe
Covered by FixVibehigh

CSRF 보호: 승인되지 않은 상태 변경으로부터 방어

CSRF(교차 사이트 요청 위조)는 여전히 웹 애플리케이션에 심각한 위협으로 남아 있습니다. 이 연구에서는 Django와 같은 최신 프레임워크가 보호를 구현하는 방법과 SameSite와 같은 브라우저 수준 속성이 무단 요청에 대한 심층 방어를 제공하는 방법을 살펴봅니다.

CWE-352

영향

CSRF(Cross-Site Request Forgery)를 통해 공격자는 피해자의 브라우저를 속여 피해자가 현재 인증된 다른 웹사이트에서 원치 않는 작업을 수행하도록 할 수 있습니다. 브라우저는 요청에 쿠키와 같은 주변 자격 증명을 자동으로 포함하기 때문에 공격자는 사용자가 모르는 사이에 암호 변경, 데이터 삭제, 트랜잭션 시작 등 상태 변경 작업을 위조할 수 있습니다.

근본 원인

CSRF의 근본적인 원인은 요청 출처 [S1]에 관계없이 해당 도메인에 대한 요청이 있을 때마다 해당 도메인과 연결된 쿠키를 보내는 웹 브라우저의 기본 동작입니다. 요청이 애플리케이션의 자체 사용자 인터페이스에서 의도적으로 트리거되었는지에 대한 구체적인 검증이 없으면 서버는 합법적인 사용자 작업과 위조된 작업을 구별할 수 없습니다.

Django CSRF 보호 메커니즘

Django는 미들웨어 및 템플릿 통합 [S2]를 통해 이러한 위험을 완화하기 위한 내장 방어 시스템을 제공합니다.

미들웨어 활성화

django.middleware.csrf.CsrfViewMiddleware는 CSRF 보호를 담당하며 일반적으로 [S2]에 의해 기본적으로 활성화됩니다. CSRF 공격이 이미 처리되었다고 가정하는 뷰 미들웨어 [S2] 앞에 위치해야 합니다.

템플릿 구현

내부 POST 양식의 경우 개발자는 <form> 요소 [S2] 내에 {% csrf_token %} 태그를 포함해야 합니다. 이렇게 하면 고유한 비밀 토큰이 요청에 포함되어 서버가 사용자 세션에 대해 유효성을 검사합니다.

토큰 유출 위험

중요한 구현 세부 사항은 {% csrf_token %}가 외부 URL [S2]를 대상으로 하는 양식에 포함되어서는 안 된다는 것입니다. 그렇게 하면 비밀 CSRF 토큰이 제3자에게 유출되어 잠재적으로 사용자 세션 보안 [S2]가 손상될 수 있습니다.

브라우저 수준 방어: SameSite 쿠키

최신 브라우저에는 심층 방어 [S1] 계층을 제공하기 위해 Set-Cookie 헤더에 대한 SameSite 속성이 도입되었습니다.

  • 엄격함: 쿠키는 자사 컨텍스트에서만 전송됩니다. 즉, URL 표시줄의 사이트가 쿠키의 도메인 [S1]와 일치합니다.
  • Lax: 쿠키는 사이트 간 하위 요청(예: 이미지 또는 프레임)에서는 전송되지 않지만 사용자가 표준 링크 [S1]를 따라 원본 사이트로 이동할 때 전송됩니다.

FixVibe가 이를 테스트하는 방법

FixVibe에는 이제 게이트 활성 검사로 CSRF 보호가 포함됩니다. 도메인 확인 후 active.csrf-protection는 발견된 상태 변경 양식을 검사하고 CSRF 토큰 형태의 입력 및 SameSite 쿠키 신호를 확인한 다음 영향이 적은 위조 원본 제출을 시도하고 서버가 이를 수락할 때만 보고합니다. 또한 쿠키 검사는 CSRF 심층 방어를 감소시키는 약한 SameSite 속성을 표시합니다.