web-dev-qa-db-ja.com

JSON WebサービスはCSRF攻撃に対して脆弱ですか?

要求と応答のコンテンツにJSONのみを使用する(つまり、フォームエンコードされたペイロードがない)Webサービスを構築しています。

以下が当てはまる場合、WebサービスはCSRF攻撃に対して脆弱ですか?

  1. トップレベルのJSONオブジェクトを持たないPOSTリクエスト、たとえば{"foo":"bar"}は、400で拒否されます。たとえば、コンテンツ42を含むPOSTリクエストしたがって、拒否されます。

  2. application/json以外のコンテンツタイプを持つPOSTリクエストは400で拒否されます。たとえば、コンテンツタイプapplication/x-www-form-urlencodedを持つPOSTリクエストは拒否されます拒否されました。

  3. すべてのGET要求は Safe になり、サーバー側のデータは変更されません。

  4. クライアントはセッションCookieを介して認証されます。Webサービスは、POST JSONデータを使用して、たとえば[{"username":"[email protected]", "password":"my password"}。]を介して正しいユーザー名/パスワードのペアを提供した後にそれらを提供します。

補助的な質問:PUTおよびDELETEリクエストはCSRFに対して脆弱ですか?ほとんどの(すべての?)ブラウザーがHTMLフォームでこれらのメソッドを許可していないようだからです。

編集:項目#4を追加しました。

編集:これまでのところ多くの良いコメントと回答がありますが、このWebサービスが脆弱な特定のCSRF攻撃を提供した人はいません。

66
djsmith

フォームのメソッドはGETおよびPOSTに制限されている および フォームのPOST=メッセージボディも3つの形式application/x-www-form-urlencodedmultipart/form-data、およびtext/plain 。ただし、 フォームデータエンコーディングtext/plain有効なJSONデータを含むリクエストを偽造することは引き続き可能です

したがって、唯一の脅威はXHRベースのCSRF攻撃によるものです。そして、それらは次のいずれかである場合にのみ成功します

両方を削除できる場合、WebサービスはCSRFに対して脆弱ではありません。少なくとも、ウェブブラウザ経由で実行されたものではありません。

64
Gumbo

はい、可能です。ターゲットサーバーへの307リダイレクトを被害者のマシンに送り返す攻撃者サーバーをセットアップできます。 Formを使用する代わりに、Flashを使用してPOSTを送信する必要があります。

リファレンス: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241

Chromeでも機能します。

2
Timothy Leung

Ajaxを使用して、JSONベースのRestfulサービスでCSRFを実行することができます。これをアプリケーションでテストしました(ChromeとFirefoxの両方を使用)。プリフライトリクエストを利用するには、contentTypeをtext/plainに、dataTypeをJSONに変更する必要があります。リクエストですが、セッションデータを送信するには、ajaxリクエストでwithCredentialsフラグを設定する必要があります。これについては、ここで詳しく説明します(参照は含まれます)。

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

1
Filip Waeytens