JSONリクエストを受け入れ、レスポンスもJSONであるテストアプリケーションで遊んでいます。 POSTメソッドでリクエストのJSONデータのみを受け入れるトランザクションに対してCSRFを実行しようとしています。getメソッドを使用してURLがリクエストされると、アプリケーションがエラーをスローします(例:<script src=
)。
また、攻撃が意味のあるものになるように、つまりトランザクションが通過するためには、リクエストでデータを送信する必要があります。自分のページを作成してJSONリクエストを送信すると、Cookieが移動しないため、サーバーが未認証のエラーメッセージを返します。
サーバーによる元のリクエストにはランダムなトークンはありません。
このシナリオでCSRF攻撃を成功させる方法はあるのでしょうか。
少なくともリクエストでContent-Type: application/json
を確認する必要があります。
POSTされた<form>
を取得してContent-Type: application/json
でリクエストを送信することはできません。ただし、本文にenctype="text/plain"
として有効なJSON構造を含むフォームを送信できます。
クロスオリジンを実行することはできません( [〜#〜] cors [〜#〜] )XMLHttpRequest POST with Content-Type: application/json
with a non-クロスオリジン対応サーバー。これにより、「プリフライト」HTTP OPTIONSリクエストが最初にそれを承認します。ただし、クロスオリジンXMLHttpRequest POST withCredentials を送信できます。 = text/plain
の場合。
したがって、application/json
チェックを使用しても、XSRFに完全に到達していなくても、かなり近づくことができます。そして、それを安全にするために依存している動作はややあいまいであり、まだ草案段階にあります。 Webの将来を保証するものではありません。
たとえば、将来のHTMLバージョンで新しいJSON enctype
がフォームに追加された場合、これらは壊れる可能性があります。 (WHATWGはtext/plain
enctypeをHTML5に追加し、元々はtext/xml
も追加しようとしたため、これが発生する可能性があることは疑いの余地がありません。 CORS実装におけるプラグインのバグ。
したがって、おそらく今はそれを回避できますが、適切なXSRFトークンシステムなしで先に進むことは絶対にお勧めしません。
https://code.google.com/p/browsersec/wiki/Part2#Same-Origin_policy_for_Flash によると、これはFlashを使用して悪用可能です。
Cookieを含むクロスドメインHTTP GETおよびPOSTリクエストをブラウザースタック経由で作成する機能。ブラウザーの他の場所で一般的に見られるよりも制約が少なくなります。これはURLRequest APIによって実現されます。特に、任意のContent-Type値を指定したり、バイナリペイロードを送信したりする機能が含まれます。
私自身はテストしていませんが、もっともらしいようです。
更新:最新のFlashリリースでは、デフォルトでクロスドメインリクエストが許可されなくなったため、これを悪用不可能にしています。
更新#2:ただし、フラッシュの307リダイレクトの処理には長年の脆弱性があり、これはまだ悪用可能であることを意味します