요청 및 응답 콘텐츠에 JSON을 독점적으로 사용하는 웹 서비스를 구축하고 있습니다 (즉, 양식 인코딩 된 페이로드 없음).
다음과 같은 경우 웹 서비스가 CSRF 공격에 취약합니까?
-
POST
예를 들어 최상위 JSON 객체가없는 모든 요청{"foo":"bar"}
은 400으로 거부됩니다. 예를 들어POST
콘텐츠42
가 있는 요청은 거부됩니다. -
상관
POST
이외의 콘텐츠 유형의 요청application/json
, 예를 들어 400으로 거부된다는POST
콘텐츠 유형 요청application/x-www-form-urlencoded
따라서 거부 될 것이다. -
모든 GET 요청은 안전 하므로 서버 측 데이터를 수정하지 않습니다.
-
클라이언트는 세션 쿠키를 통해 인증되며, 웹 서비스는 JSON 데이터와 함께 POST를 통해 올바른 사용자 이름 / 암호 쌍을 제공 한 후 제공합니다
{"username":"user@example.com", "password":"my password"}
.
부수적 인 질문 : PUT
및 DELETE
요청이 CSRF에 취약한 적이 있습니까? 대부분의 (모든?) 브라우저가 HTML 양식에서 이러한 메서드를 허용하지 않는 것 같아서 묻습니다.
편집 : 항목 # 4를 추가했습니다.
편집 : 지금까지 좋은 댓글과 답변이 많지만,이 웹 서비스가 취약한 특정 CSRF 공격을 제공 한 사람은 없습니다.
답변
임의의 미디어 유형을 사용하여 임의의 CSRF 요청을 위조하는 것은 XHR에서만 효과적으로 가능합니다. 양식의 메소드는 GET 및 POST 및 형태의 POST 메시지 본문은 또한 세 가지 형식에 제한 application/x-www-form-urlencoded
, multipart/form-data
및text/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 요청을하는 유일한 방법이라고 생각하십니까?