質問

ユーザーがクリックしたい場合にのみ、Webアプリケーションにリクエストを発射する必要があるJavaScriptウィジェットがあるとしましょう。このリクエストがCSRFに対して脆弱であることを望まないので、ページにiframeを書きます。に基づく 起源の継承ルール 親サイトはCSRFトークンを読むことができません。ただし、ClickJacking(または ジャッキングのような )? CSRFのため、あなたはiframe内にあり、そこにいる必要があります X-Frame-Options 助けにはならず、同じことが当てはまります フレームバスター.

攻撃者が適用します SVGマスク ウィジェットがロードされた後のiframe。このマスクは、iframeを見えないようにします。この時点で、攻撃者はiframeをページのサイズにサイズを変更するか、これを目に見えないiframeにカーソルに従うことができます。いずれにせよ、ユーザーがページ上のどこにでもクリックするたびに、iframeはクリックイベントとそのゲームを受け取ります。

したがって、二重性があります。CSRFとクリックジャックの間に立ち往生しているようです。この問題に対する最良の解決策(もしあれば)は何ですか?

役に立ちましたか?

解決

ウィジェットをクリックすると、新しいページを含むポップアップウィンドウを開く必要があります。IFRAMEは十分ではなく、新しいウィンドウである必要があります。これは、Webアプリケーションの制御下にあります。そのページで、アクションを確認してください。

はい、これはやや不可分ですが、現在のWebセキュリティアーキテクチャはより良いオプションを提供しません。

他のヒント

クリックジャック攻撃中にリクエストフォーファリーを防ぐ方法はありません。クライアント側の偽のクリックと実際のクリックを区別する方法がないため、クリックジャック攻撃に耐えることができるCSRF防御は存在しません。

owasp CRSF予防スプレッドシートに言及しています CSRFトークン防御が機能するための前提条件の1つは、XSS攻撃が進行中でないということです。

私の見解では、これにはClickJackingも含まれているはずです。Iframe内に隠されているCSRFトークンはClickJackingを防御できないからです。直接ユーザーのクリックによってリクエストが偽造されています。

したがって、最終的にはCSRFとクリックジャックの間に実際に立ち往生していません。CSRF防御は、攻撃者の側にははるかに少ないパワーがある別のタイプの攻撃を目的としています。

だから、クリックジャックとCSRFに関して言及した質問に向けて:

  • この問題に対する最良の解決策(もしあれば)は何ですか? - クライアント側のクリックジャックの最良の防御は、 @Zackが言及しているように、サイトのページを備えた新しいブラウザタブまたはサイズ変更されたブラウザウィンドウを開き、そこでアクションを確認することです。これはTwitterボタンが行うことであり、このシナリオにもリクエストの偽造がありません。

  • だから二重性があります、あなたはCSRFとクリックジャックの間に立ち往生しているようです -CSRF防御は、XSSやクリックジャック攻撃などのケースを対象としているわけではなく、強力ではない攻撃に対してのみ効果的です(悪意のあるリンクを含む電子メール、フォーラムの悪意のあるリンクなど)

良いプログラム可能なものはありません ClickJackingの解決策. 。一部の企業は、スパマーをクリックジャックするための防御として訴えています。他の人は、特にシングルクリックボタンの場合にユーザーエクスペリエンスを低下させますが、ユーザーがiframe内でクリックした後、ポップアップウィンドウを表示することを選択します。これはまさに、Twitterが「リツイート」ボタンに対して行うことです。 Facebookは現在、このアプローチを「いいね」ボタンに展開しており、ブラックリストドメインからのリクエストが来るたびに確認を求めています。 GoogleBotは、「+1」ボタン(計算されたスタイル、重複などをチェックするなど)でページをインデックス付けしながら、クリックジャックヒューリスティックを実行すると聞きました。

- アップデート -「ウィジェット」と言うとき、あなたがあなたの承認のない人々がやり取りするアプリケーションの外側の何かを意味するなら、この答えを無視してください。私はあなたの質問を読み直します、そして、あなたはあなたが「ウィジェット」の意味を実際に述べることは決してありません。アプリケーションにはあらゆる種類の「ウィジェット」があります。私はそれがあなたが話していたことだと思いました、認証されたユーザーのみが対話しているアプリケーション内のすべて。その場合、この答えはOWASPが推奨するものです。

- オリジナルの答え -「このリクエストがCSRFに対して脆弱であることを望まないので、ページにiframeを書きます。」いいえ、iframeを作成しないでください。そのため、クロスサイトのフレーミングから保護するための通常のOWASP推奨を行うことができます。

CSRFハッシュからある程度の値を保護するには、フォーム(またはAjax Post Data)に含める値(またはAjax Post Data)を含めてから、バックエンドのハッシュ値を確認します。それが一致する場合、それはあなたのサイトからです。ハッシュに入れることができるより具体的なデータの方が良いでしょう。

例:ユーザーがサインインすると、長いランダムな文字列を作成し、セッションに結び付けることができます。この文字列は、サイトに表示されないか、ソースを表示するときは決して表示されない必要があります。次に、ユーザーが編集したい特定のレコードを引き上げるとしましょう。その後、作成した長いランダムな文字列を使用して、その主要なキーを記録してからハッシュします。そのハッシュの結果、あなたは自分の形に隠されたものとして含めることができます。その後、バックエンドで何かをする前に、その隠された存在をチェックしてください。存在しない場合は中止します。それが存在する場合は、ユーザーがランダムなセッション文字列と提出したクリアテキストの主キーを使用して、それがあなたのサイトからのものであることがわかっている場合、それらをハッシュします。

また、サイトが既に書かれている場合でも、どこにでもこれを追加するのは簡単です(フッターのように、サイトにすべてのページにいくつかの単一のコードが含まれていると仮定します)。ハッシュされた値を作り、フッターのどこかに隠されたDivに置きます。次に、jQueryを使用して、ページ上のすべてのフォームに隠されたこのハッシュ値を動的に追加できます。また、jquery.ajaxprefilterを使用して、通常のフォーム投稿ではなくAjax投稿を行っている場合に備えて、すべてのAjax投稿に自動的に追加できます。この方法ですでにコード化されている非常に大きなサイトを保護しています。

https://www.owasp.org/index.php/cross-site_request_forgery_(csrf)_prevention_cheat_sheet

これがあなたがとりたいと思うそのように聞こえるなら、私はそれを行うためのjQueryコードのいくつかを表示することができます。あなたがハッシュしているもの、バックエンドでそれをどのようにチェックするかなど、すべてがColdFusion、PHP、PL/SQL(PSP)などを使用しているかどうかに依存しています...その1つの場合、正しい方向。

私はあなたが何をしているのか理解していると思います。任意のサイトがウィジェットをiframeにすることを許可するため、攻撃者は親のソースコードを完全に制御し、クリックジャックルーチンを作成してユーザーにウィジェットをクリックしてもらいます。

したがって、IFRAMEは、親フレームがトークンを読み取れない限り、このタイプの攻撃から保護するCSRFトークンを必要とするように使用できます。

ClickJackingは、ご存知のように、CSRFとはまったく異なるタイプの攻撃であり、異なる防御が必要です。

本当に、ウィジェットが2フェーズ認証を実装するよりも非常に重要な場合。使用する http://twilio.com ユーザーに電話して、ピンを入力させます。または、確認リンクを使用してユーザーにメールを送信します。または、ユーザーがウィジェットのWebサイトにログインするときに、アクションを確認するようにユーザーに依頼します。

親フレームを制御できれば、より多くのオプションがあります。その場合、それはXSS保護事項になります。

正解が選択された後に更新します

したがって、クリックジャックから保護するための私のアプローチは少し船外です。確認アクションを備えたポップアップウィンドウを使用して保護できるようです。

CSRFのために、あなたはiframe内にいる必要があります...

いいえ。フォームCookieやその他の非CEトリックでCSRFを修正することはできません。どこに置いたかは関係ありません。

したがって、二重性があります。CSRFとクリックジャックの間に立ち往生しているようです。この問題に対する最良の解決策(もしあれば)は何ですか?

CSRFを修正するには、注入または悪意のあるコードがあるサーバーを修正し、フィッシングメールを停止するなど、脅威を削除する必要があります。良性環境がない場合、ユーザーを再認定する必要があります(または別の課題を提供する必要があります(または別の課題を提供する必要があります/インタラクティブなユーザーを確保するための応答)。見る:

javascriptでクリックジャックを再開したり、xフレームオプションまたはフレームブレイクコードを使用したりします。しかし、私はどちらも絶対確実だとは思いません。見る:

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top