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


82

リクエストとレスポンスのコンテンツにJSONのみを使用する(つまり、フォームでエンコードされたペイロードを使用しない)Webサービスを構築しています。

次の場合、WebサービスはCSRF攻撃に対して脆弱ですか?

  1. どれでもPOSTトップレベルのJSONオブジェクトのない要求は、例えば、{"foo":"bar"}たとえば、400で拒否されますが、POST内容の要求は42これ拒否されるだろう。

  2. 任意POST以外のコンテンツ・タイプの要求application/json例えば400で拒否されますが、POSTコンテンツタイプの要求はapplication/x-www-form-urlencoded、したがって拒否されるであろう。

  3. すべてのGETリクエストは安全であるため、サーバー側のデータは変更されません。

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

補助的な質問:CSRFに対して脆弱なものはPUTありDELETEますか?ほとんどの(すべて?)ブラウザがHTMLフォームでこれらのメソッドを許可していないように思われるので、私は尋ねます。

編集:アイテム#4を追加しました。

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


セッションとCookieのペアの値を介してリクエストをトークン化し、送信されたJSONを介してトリガーしているディレクティブを
サニタイズし、

良い答えを提供するのに十分な情報がここにあるとは思いません。どの認証方法を使用していますか?Webサービスの対象となる消費者(つまり、サービスと同じホスト上のサイトのユーザー)は誰ですか?
McGarnagle 2012年

1
現在のすべての検証は完全に賢明であり、攻撃対象領域を制限しますが、実際にはCSRFの脆弱性とは何の関係もありません。
cheekysoft 2012年


2
@DavidBalažicどのベクトル?AJAXについて話している場合、同一生成元ポリシーはそれを防ぎます。
djsmith 2015年

回答:


73

任意のメディアタイプで任意CSRF要求を鍛造するため、XHRと効果的にのみ可能であるフォームの方法は、GETおよびPOSTに限定されるフォームのPOSTメッセージボディはまた3つの形式に制限されapplication/x-www-form-urlencodedmultipart/form-dataおよびtext/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本体のタイプに依存しないで、反CSRFトークンを使用してください。
LordOfThePigs 2014

@LordOfThePigs有効なJSONの偽造は、text / plainですでに可能です。
ガンボ2014

@Gumboは正しいですが、現在application/json、この回答でCSRF攻撃を阻止するために使用されるenctypeを設定することはできません。提案された標準では、enctypeをに設定できますapplication/json。これにより、回答で概説されているコンテンツタイプのチェックが無効になり、アプリケーションがCSRFに開かれます。
LordOfThePigs 2014

10
ドラフトがこの攻撃を先取りしているようです。セクション5は、application/jsonフォーム投稿が同一生成元ポリシーに準拠する必要があることを指定しています。つまり、攻撃はXHRよりも強力ではありません。
James_pic 2015年


1

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


それは不要です。サーバーがプレーンテキストリクエストをJSONとして読み取る場合、Gumboが述べたように、プレーンテキストとしてエンコードされたフォームはそのようなリクエストを偽造するのに十分です。APIサーバーは、プレーンテキスト要求を単に拒否する必要があります。
フランクリンユー

-1

ポイント3については疑問があります。サーバー側のデータを変更しないので安全とは言えますが、データの読み取りは可能であり、盗難の恐れがあります。

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


1
これは、APIによって返される最上位オブジェクトがJSON配列である場合にのみ機能します。これは、Javascriptで配列コンストラクターをオーバーライドできるためです。トップレベルのオブジェクトは安全です。より多くのflask.pocoo.org/docs/0.10/security/#json-security
btubbs 2015年

著者自身によると、「最近のブラウザにこの欠陥はもうないと思います」。
フランクリンユー

-6

次の場合、WebサービスはCSRF攻撃に対して脆弱ですか?

はい。それはまだHTTPです。

PUTおよびDELETEリクエストはCSRFに対して脆弱ですか?

はい

ほとんどの(すべて?)ブラウザは、HTMLフォームでこれらのメソッドを許可していないようです

ブラウザがHTTPリクエストを行う唯一の方法だと思いますか?


3
サービスがHTTPを使用しているからといって、CSRFに対して脆弱になるわけではありません。説明したように、このサービスが脆弱である実際のCSRF攻撃ベクトルを特定できますか?そしてもちろん、ブラウザがHTTPリクエストを作成する唯一の方法ではないと思いますが、ブラウザは、ユーザーがだまされて偽造されたクロスサイトリクエストを作成するのが最も一般的(唯一?)です。期待します。
djsmith 2012年

言い換えると、PUTを使用してユーザーをだましてWebサービスにPUTリクエストを送信させる特定のCSRF攻撃ベクトルを見せてください(説明どおり)。それは不可能だと思います。
djsmith 2012年

@symcbean:参照を投稿するか、そうでなければあなたの答えを擁護していただけませんか?私はこの回答に投票していません。最初にチャイムを鳴らしてください。ありがとう。
dotancohen 2013年

グーグルは再びダウンしていますか?コンテンツタイプのものは別として、古いバージョンのFlash(最近のバージョンのFlashにはクロスドミアン制御モデルがありますが、HTML5とは異なります)-jarの密輸はどうですか-pseudo-flaw.net/content/web-browsers/corrupted -jars(Javaはアクティブコンテキストで実行されますが、パッシブコンテキストでjavascriptを呼び出すことができます)。次に、DNS再バインド攻撃とMITM攻撃があります
symcbean 2013

ブラウザプラグインはCSRFCookieを読み取り、必要なヘッダーを送信できるため、デファクトスタンダードのCSRF施行メカニズムでさえ、悪意のあるブラウザプラグインに対して脆弱です。
djsmith 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.