web-dev-qa-db-ja.com

POSTメソッドを使用してjsonハイジャックを防ぐことができるのはなぜですか?

jsonメソッドでGetを返すときに、次のASP.NET MVCエラーに遭遇しました。

機密情報がGETリクエストで使用されると、サードパーティのWebサイトに開示される可能性があるため、このリクエストはブロックされました。 GETリクエストを許可するには、JsonRequestBehaviorをAllowGetに設定します。

どうやらこの脆弱性はjson Hijackingと呼ばれています。 この記事 は、jsonを使用してGetを返すときにWebサイトが悪用される可能性があることを説明しています。ただし、jsonメソッドでPostを返すのは安全です。

GetPostに変更すると、なぜこの攻撃を防ぐことができるのですか?

7
Hooman Bahreini

スクリプト、画像、スタイルシート、フォントを含むWebページでネットワークパネルを開くと、それらすべてのリクエストがGET HTTPメソッドを使用して行われていることがわかります。たとえば、これは<script>タグによってロードされたファイルのリクエストがどのように見えるかです。

An example of a GET request for a JavaScript file

そして、これは<img>タグによってロードされたファイルの例です。

An example of a GET request for an image

ブラウザは、あなたが何をしているかを知っているどこからでもそのようなリソースをロードしている場合、あなたがそれをフェッチすることを盲目的に信頼します(そうでなければ、CDNのようなものが機能しません) XHRリクエスト

XHRリクエスト(fetch呼び出しを含む)はCORSポリシーに照らしてチェックされます。それが何であるかはご存知だと思います。 JavaScriptは、別のドメイン(またはポートなど)に存在するリソースに対してXHRリクエストを行うことができません。

したがって、2種類のリクエストポリシーがあります。

  1. XHRを使用してフェッチしたものはすべてCORSに対してチェックされますが、任意のHTTPリクエストメソッドを選択できます
  2. imgscriptlinkなどを使用してロードしたものは、CORSポリシーに対してチェックされませんが、GET HTTPリクエストのみ。また、ブラウザはすべてのCookieを送信します。この場合、最も重要なのは認証のCookieです。

つまり、GETを使用してJSON配列を提供している場合は、scriptタグを使用して、どのドメインを使用していてもフェッチすることができます。次に、記事に記載されているトリックを使用して、配列を実行して(奇妙に聞こえますがはい)、機密情報を取得できます。

POSTを使用する場合、攻撃者はscriptリクエストを使用してリソースをフェッチするため、GET(またはその他の)タグを使用してこのリクエストを実行する方法はありません。 。

あなたはと思うかもしれませんが、formを使用してそれを行うことができます!しかし、同じCORSの問題が発生します。 formを送信するだけの場合、JSONデータは現在のページに読み込まれ、スクリプトがページに存在しないため、攻撃者がそれを取得する方法はありません。

ああ、私はformターゲットをiframeに設定するだけですが、JavaScriptではそのiframe

それは理にかなっていますか?

2

JSONはGETとして返すべきではありません。攻撃者からの<script>の挿入によりデータが盗まれる可能性があるためです(たとえば、動的コンテンツがHTMLエスケープされずに読み込まれる場合)。スクリプトはGETメソッドを介してサーバーから要求されるため、POSTを使用してサーバーから送信されたものは、挿入されたスクリプトから実行されません。スクリプトが実行されると、ハッカーはログインしたCookieを使用してJSONにアクセスできますが、JSONはこれを許可されるべきではありません。

JSONハッキングの脆弱性の詳細については、 この記事 および this SO answer を参照してください。

1
Elijah Mock