JSON 웹 서비스는 CSRF 공격에 취약합니까?


82

요청 및 응답 콘텐츠에 JSON을 독점적으로 사용하는 웹 서비스를 구축하고 있습니다 (즉, 양식 인코딩 된 페이로드 없음).

다음과 같은 경우 웹 서비스가 CSRF 공격에 취약합니까?

  1. POST예를 들어 최상위 JSON 객체가없는 모든 요청 {"foo":"bar"}은 400으로 거부됩니다. 예를 들어 POST콘텐츠 42가 있는 요청은 거부됩니다.

  2. 상관 POST이외의 콘텐츠 유형의 요청 application/json, 예를 들어 400으로 거부된다는 POST콘텐츠 유형 요청 application/x-www-form-urlencoded따라서 거부 될 것이다.

  3. 모든 GET 요청은 안전 하므로 서버 측 데이터를 수정하지 않습니다.

  4. 클라이언트는 세션 쿠키를 통해 인증되며, 웹 서비스는 JSON 데이터와 함께 POST를 통해 올바른 사용자 이름 / 암호 쌍을 제공 한 후 제공합니다 {"username":"user@example.com", "password":"my password"}.

부수적 인 질문 : PUTDELETE요청이 CSRF에 취약한 적이 있습니까? 대부분의 (모든?) 브라우저가 HTML 양식에서 이러한 메서드를 허용하지 않는 것 같아서 묻습니다.

편집 : 항목 # 4를 추가했습니다.

편집 : 지금까지 좋은 댓글과 답변이 많지만,이 웹 서비스가 취약한 특정 CSRF 공격을 제공 한 사람은 없습니다.


여분의 맛 소금을 추가, 당신은 제출 된 JSON을 통해 유발되는 어떤 지시 세션 & 쿠키 쌍 값, 살균을 통해 요청을 토큰 화
브랜 Solovij

여기에 좋은 답변을 제공하기에 충분한 정보가 없다고 생각합니다. 어떤 인증 방법을 사용하고 있습니까? 웹 서비스의 의도 된 소비자는 누구인가 (즉, 서비스와 동일한 호스트에 사이트의 사용자?)
McGarnagle

1
현재의 모든 유효성 검사는 완벽하게 합리적이며 공격 표면을 제한하지만 실제로 CSRF 취약점과 관련된 어떤 것도 해결하지 않습니다.
Cheekysoft


2
@ DavidBalažic 무슨 벡터? AJAX에 대해 이야기하는 경우 동일 출처 정책이이를 방지합니다.
djsmith

답변:


73

임의의 미디어 유형을 사용하여 임의의 CSRF 요청을 위조하는 것은 XHR에서만 효과적으로 가능합니다. 양식의 메소드는 GET 및 POST 형태의 POST 메시지 본문은 또한 세 가지 형식에 제한 application/x-www-form-urlencoded, multipart/form-datatext/plain . 그러나 양식 데이터 인코딩을 사용 text/plain하면 유효한 JSON 데이터를 포함하는 요청을 위조 할 수 있습니다 .

따라서 유일한 위협은 XHR 기반 CSRF 공격에서 비롯됩니다. 그리고 그것들은 같은 출처에서 왔을 때만 성공할 것입니다. 그래서 기본적으로 여러분의 사이트 (예 : XSS)에서 온 것입니다. CORS 비활성화 (예 : Access-Control-Allow-Origin : *를 설정하지 않음)를 보호 수단으로 잘못 사용하지 않도록주의하십시오. CORS는 단순히 클라이언트가 응답을 읽지 못하게합니다. 전체 요청은 여전히 ​​서버에 의해 전송되고 처리됩니다.


9
연결된 답변에 대해 언급했듯이 서버에 application / json이 필요하지 않은 경우 pentestmonkey.net/blog/csrf-xml-post-request 와 유사한 기술을 사용하여 text / plain을 실제로 JSON 위조에 사용할 수 있다고 주장합니다 .

8
그 대답은 오늘까지 정확하지만 곧 틀릴 것입니다. W3C는 HTML 표준에 enctype = "application / json"을 추가하는 것을 고려하고 있습니다 : darobin.github.io/formic/specs/json 따라서 지속적인 보안을 위해 POST 본문 유형에 의존하지 말고 anti-CSRF 토큰을 사용하십시오.
LordOfThePigs

@LordOfThePigs 유효한 JSON을 위조하는 것은 text / plain으로 이미 가능합니다 .
Gumbo

@Gumbo가 정확하지만 현재이 application/json답변에서 CSRF 공격을 막는 데 사용되는 enctype을 설정할 수 없습니다 . 제안 된 표준을 사용하면 enctype을로 설정할 수 있습니다 application/json. 그러면 답변에 설명 된 콘텐츠 유형 검사가 무효화되고 애플리케이션이 CSRF에 열립니다.
LordOfThePigs

10
드래프트가이 공격을 선점 한 것 같습니다. 섹션 5는 application/json양식 게시물이 동일한 출처 정책을 준수해야 한다고 명시합니다 . 즉, 공격이 XHR보다 강력하지 않습니다.
James_pic


1

Ajax를 사용하여 JSON 기반 Restful 서비스에서 CSRF를 수행 할 수 있습니다. 나는 이것을 응용 프로그램에서 테스트했습니다 (Chrome과 Firefox 사용). preflight 요청을 취소하려면 contentType을 text / plain으로, dataType을 JSON으로 변경해야합니다. 그런 다음 요청을 보낼 수 있지만 세션 데이터를 보내려면 ajax 요청에 withCredentials 플래그를 설정해야합니다. 여기에서 더 자세히 논의합니다 (참조가 포함되어 있음).

http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html


그것은 불필요합니다. 서버가 일반 텍스트 요청을 JSON으로 읽는 경우, Gumbo가 언급했듯이 일반 텍스트로 인코딩 된 양식은 이러한 요청을 위조하기에 충분합니다. API 서버는 단순히 일반 텍스트 요청을 거부해야합니다.
Franklin Yu

-1

포인트 3과 관련하여 약간의 의구심이 있습니다. 서버 측의 데이터를 변경하지 않기 때문에 안전하다고 생각할 수 있지만 데이터는 여전히 읽을 수 있으며 도난 당할 위험이 있습니다.

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/


1
Javascript가 Array 생성자를 재정의 할 수 있기 때문에 API에서 반환 된 최상위 개체가 JSON 배열 인 경우에만 작동합니다. 최상위 개체는 안전합니다. flask.pocoo.org/docs/0.10/security/#json-security 에서 자세히 알아보세요 .
btubbs

저자 자신에 따르면,“ 현대 브라우저에는 더 이상이 결함이 없다고 생각합니다 .”
Franklin Yu

-6

다음과 같은 경우 웹 서비스가 CSRF 공격에 취약합니까?

예. 여전히 HTTP입니다.

PUT 및 DELETE 요청이 CSRF에 취약합니까?

대부분의 (모든?) 브라우저는 HTML 양식에서 이러한 메서드를 허용하지 않는 것 같습니다.

브라우저가 HTTP 요청을하는 유일한 방법이라고 생각하십니까?


3
서비스가 HTTP를 사용한다고해서 CSRF에 취약 해지지는 않습니다. 설명한대로이 서비스가 취약한 실제 CSRF 공격 벡터를 식별 할 수 있습니까? 그리고 물론 저는 브라우저가 HTTP 요청을하는 유일한 방법이라고 생각하지 않지만, 브라우저는 사용자가 속이지 않은 위조 된 교차 사이트 요청을하도록 속이는 것이 가장 일반적입니다. 배고 있다.
djsmith

즉, PUT를 사용하여 사용자가 내 웹 서비스에 PUT 요청을 제출하도록 속이는 특정 CSRF 공격 벡터를 보여줍니다 (설명 된대로). 나는 그것이 불가능하다고 믿습니다.
djsmith

@symcbean : 참조를 게시하거나 답변을 변호 해 주시겠습니까? 나는이 답변에 투표하지 않았습니다. 먼저 차임으로 들려주세요. 감사.
dotancohen 2013 년

Google이 또 다운 되나요? 콘텐츠 유형은 제쳐두고, 이전 버전의 플래시 (최신 버전의 플래시에는 크로스 도메인 제어 모델이 있지만 HTML5와는 다름)-항아리 밀수는 어떻습니까-pseudo-flaw.net/content/web-browsers/corrupted -jars (Java는 활성 컨텍스트에서 실행되지만 수동 컨텍스트에서 javascript를 호출 할 수 있음). 그리고 DNS 리 바인딩 공격과 MITM 공격이 있습니다
symcbean

브라우저 플러그인은 CSRF 쿠키를 읽고 원하는 헤더를 보낼 수 있으므로 사실상의 표준 CSRF 시행 메커니즘조차도 악성 브라우저 플러그인에 취약합니다.
djsmith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.