シンクロナイザートークンパターンを使用してCSRF(CSRFはクロスサイトリクエストフォージェリを意味します)を防ぐことについて読んでいますが、実際にどのように安全であるかわかりません。
2つのURLを持つ偽の銀行サイトfakebank.comがあるとしましょう。
fakebank.com/withdrawForm.html
-出金フォームを表示するGETリクエストfakebank.com/doWithdraw
- POSTこのURLに撤回を行うセキュリティ上の欠陥についての私の理解は、maliciousSite.com
がPOSTリクエストをfakebank.com/doWithdraw
にスプーフィングする可能性があることです。現在、fakebankにログインしている場合、POSTは成功します。
fakebank.com/withdrawForm.html
にシークレットコードを埋め込むシンクロナイザートークンパターンを実装するとします。 maliciousSite.com
は、そのフォームのGETリクエストをスプーフィングし、htmlの結果を解析してトークンを取得し、そのトークンを使用してPOSTリクエストを作成することはできませんか?
これは、fakebank.comがHTTPリファラーまたはオリジンをチェックしていないか、maliciousSite.com
がリファラー/オリジンがfakebank.comであることをスプーフィングしていることを前提としています。
これが安全であり、maliciousSite.com
が単にGET
を実行してトークンを盗み、次にPOST
を実行できない理由は、リクエストがユーザーのブラウザによって行われるためであり、 maliciousSite.com
のサーバーによって。 fakebank.com
から返されるすべてのデータは、maliciousSite.com
のサーバーではなく、ユーザーのブラウザに返されます。 maliciousSite.com
がGETを実行してトークンを取得する場合、それはユーザーに発行されたものとは異なるトークンになります。 maliciousSite.com
は、同じドメインの制限のため、このCookieをユーザーのブラウザに設定してfakebank.com
に送信することはできません。
CSRF POST
攻撃は、適切に形成されたPOST
リクエストを使用して、ユーザーのブラウザをだましてfakebank.com/withdrawForm.html
を直接リクエストさせることで機能します。 fakebank.com
のサーバーは、要求されたPOST
を正常に実行し、POST
本体で提供されたパラメーター(攻撃者が所有する攻撃者に属する宛先アカウントを含む)を使用して資金を転送します。 maliciousSite.com
)。 maliciousSite.com
のサーバーは、アクションが実行されたため、返されたデータを確認する必要はありません(fakebank.com
がこれらのCSRFトークンを使用しない限り、maliciousSite.com
はそれがないとわからない可能性があります)何らかの方法で漏えいしました。それを求めることはできません)。 fakebank.com
がCSRFトークンを使用している場合、maliciousSite.com
はトークンが欠落しているPOST
リクエストを送信するため、CSRF攻撃が進行中である可能性があります。
この方法の脆弱性には、十分に秘密にされておらず、何らかの方法で漏えいしているCSRFトークンの使用が含まれます。また、CSRFトークンが十分にランダムでない場合、maliciousSite.com
はそれを推測できる可能性があります。また、ブラウザによる同一ドメインポリシーの適用に弱点がある場合、これが悪用される可能性があります。一般的に言って、最近のブラウザはこれに対して脆弱ではありません。
これが不十分な説明である場合はお知らせください。もう少しわかりやすく説明します。
そしてそれがまさにポイントです。ブラウザの 同一生成元ポリシー は他のサイトへの[〜#〜] get [〜#〜]リクエストを許可しません。したがって、ブラウザ内でJavasciptを使用するだけで、別のサイトからCSRFトークンを取得できるサイトはありません。