2016-11-28 5 views
1

올바르게 이해하면 CSRF 공격에서 악의적 인 웹 사이트 은 내 브라우저가 B 사이트로 요청을 보내라고 알려줍니다. 내 브라우저는 해당 요청에 내 B 쿠키를 자동으로 포함합니다. 이미 요청이 합법적 모양 B에서 인증하고있어, 무엇이든지 행동하는 것은 성공적으로 수행 될 것이다 요구 된 경우 있지만는 그 쿠키를 볼 수 없습니다. 이를 피하기 위해 양식이 포함 된 B 페이지를 방문 할 때마다 CSRF 토큰을받습니다. 이 토큰은 내 세션과 연관되어 있으므로 B으로 POST를 작성하면 해당 토큰을 포함해야합니다. 그렇지 않은 경우 B은 내 요청을 거부합니다. 이 체계의 이점은 은 해당 토큰에 액세스 할 수 없다는 것입니다.악의적 인 사이트가 공격하기 전에 GET을 통해 CSRF 토큰을 얻을 수없는 이유는 무엇입니까?

나는 두 가지 질문이 있습니다

  • 는 위의 설명은 정확합니까?
  • 그렇다면, 왜 수없는 사이트 최초의 브라우저 B에 지금 POST를 보낼 수있는 토큰을 사용 후 응답에서 CSRF 토큰을 구 B에 GET를 보내하는 말? 토큰은 유효하고 내 세션과 연결됩니다. GET에는 내 B 쿠키가 모두 포함되어 있습니다.

감사합니다.

+0

동일한 출처 정책은 사이트 B가 사이트 A의 콘텐츠를 사용자로 읽지 못하도록합니다. –

답변

3

설명이 정확합니다.

사이트 A가 브라우저에 B로 이동하여 토큰을 받았다고 말하면 괜찮습니다.하지만 도메인 간 요청이므로 A는 Javascript의 토큰에 액세스 할 수 없습니다 (브라우저 기능 임). 따라서 A가 브라우저에게 B로 돌아가 실제로 뭔가를하도록 지시하면 요청에 토큰을 포함시킬 수 없습니다. B는 쿠키로 토큰을 설정하지 않은 경우이다

. 분명히, 그것은 토큰 쿠키가 보내 졌을 것이기 때문에 결함이있는 것입니다. 따라서 어떤 보호도 무효화됩니다. 따라서이 경우 토큰은 양식 값 또는 요청 헤더 (또는 쿠키와 같이 자동으로 전송되지 않는 다른 것)로 보내야합니다.

이것은 또한 B는 크로스 사이트 스크립팅에 취약 경우,이 토큰은 다음 도난 될 수 있기 때문에, 또한 CSRF에 취약하지만, CSRF 다음 작은 문제가 있다는 것을 의미한다.:)

+0

답해 주셔서 감사합니다. 내가 아직 이해하지 못하는 것은이 "브라우저 기능"입니다 (나는 CORS를 언급한다고 상상합니다). 도메인 간 요청을 수행하는 사이트가 많기 때문에 실제로 응답 내용을 볼 수 있습니다. 생각할 수있는 가장 간단한 예는 src가 다른 도메인을 가리키는 이미지를 포함하는 것입니다. 내가 얻지 못하는 것은 서버가 이미지와 페이지가 아닌 다른 Access-Control-Allow-Origin 헤더를 보내거나 브라우저가이를 처리하고있는 경우입니다. 다시 한번 감사드립니다. – thelastone

+1

실제로이 기능은 SOP, 동일한 원점 정책이라고합니다. Javascript는 다른 사이트가 요청자 액세스를 허용하는 CORS (원본 출처가 다른 리소스 공유) 헤더를 전송하지 않는 한 페이지 자체에서 다운로드 한 콘텐츠에만 액세스 할 수 있습니다. Javascript는 원본 교차 이미지에도 액세스 할 수 없지만 사용자에게 표시됩니다. 마찬가지로 다른 원점을로드하여 iframe에 표시 할 수 있지만 (x-frame-options가 전송되지는 않지만 다른 스토리입니다) 외부 페이지는 iframe 내용에 액세스 할 수 없습니다. –

1

수정.

사이트 A 때문에 브라우저의 CORS 전략의 사이트 B의 CSRF 토큰을 얻을 수 없습니다.

는 그리고 우리는 요청의 referer은 (그것은 위조 할 수있다)의 유효성을 검사 할 필요가있다. https://en.wikipedia.org/wiki/HTTP_referer

url (AKA 쿼리 문자열)에서 crsf 토큰의 유효성을 검사하는 것도 좋습니다. 참고로

, Laravel, 인기있는 웹 프레임 워크는 CSRF 공격을 방지하는 형태로 숨겨진 CSRF 토큰 필드를 사용합니다.

+0

내 질문에 언급 된 숨겨진 CSRF 토큰에 대해 알고 있습니다. 따라서 내가 올바르게 이해한다면, 서버가 다른 참조 자 (브라우저가 올바른지 확인해야합니다)의 요청에 CSRF 토큰을 포함하는 응답을 보내지 못하도록 서버에 지시함으로써 공격을 막을 수 있습니다. – thelastone

+0

@Mugarte Bingo. – solarhell