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

요청 및 응답 콘텐츠에 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 공격을 제공 한 사람은 없습니다.



답변

임의의 미디어 유형을 사용하여 임의의 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는 단순히 클라이언트가 응답을 읽지 못하게합니다. 전체 요청은 여전히 ​​서버에 의해 전송되고 처리됩니다.


답변

예, 가능합니다. 307 리디렉션을 대상 서버로 다시 대상 컴퓨터로 보내는 공격자 서버를 설정할 수 있습니다. Form을 사용하는 대신 Flash를 사용하여 POST를 보내야합니다.

참조 : https://bugzilla.mozilla.org/show_bug.cgi?id=1436241

Chrome에서도 작동합니다.


답변

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


답변

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

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


답변

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

예. 여전히 HTTP입니다.

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

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

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


답변