web-dev-qa-db-ja.com

CSRFを理解する

「チャレンジトークン」を使用すると、どのような予防策が追加されるのかわかりません。どの値を何と比較する必要がありますか?

から [〜#〜] owasp [〜#〜]

通常、開発者は現在のセッションでこのトークンを1回だけ生成する必要があります。このトークンの最初の生成後、値はセッションに格納され、セッションが期限切れになるまで後続の各要求に使用されます。

私がプロセスを正しく理解していれば、これが起こります。

http://example.com でログインすると、このランダムトークンを含むセッション/ Cookieが作成されます。次に、すべてのフォームには、フォーム送信時にセッション/ Cookieと比較される、セッションからのこのランダムな値も含む非表示の入力が含まれます。

しかし、それは何を達成しますか?セッションデータを取得してページに配置し、まったく同じセッションデータと比較するだけではありませんか?循環論法のようです。これらの記事は「同一生成元ポリシー」に従うことについて話し続けていますが、すべてのCSRF攻撃はユーザーと同じ発信元であり、ユーザーをだまして意図しないアクションを実行させるため、それは意味がありません。

トークンをすべてのURLにクエリ文字列として追加する以外の方法はありますか?非常に醜くて実用的ではないようで、ユーザーにとってブックマークが難しくなります。

33
Lotus Notes

攻撃者はトークンを取得する方法がありません。したがって、リクエストは有効になりません。

Gnucitizenからのこの投稿をお勧めします。それはかなりまともなCSRFの説明があります: http://www.gnucitizen.org/blog/csrf-demystified/

30
rogeriopvl

あなたは自分自身のためにこのトピックを研究し続ける必要があります、しかし私はあなたがSO :)に投稿している理由だと思います。 [〜#〜] csrf [〜#〜] は、すべてのWebアプリ開発者が知っておくべき非常に深刻で広範囲にわたる脆弱性タイプです。

まず第一に、複数あります 同一生成元ポリシー 。ただし、最も重要な部分は、 http://whatever.com からホストされているスクリプトは http://victom.com からデータを読み取ることはできませんが、データを送信することはできます。 POST and GET。リクエストに攻撃者が知っている情報のみが含まれている場合、攻撃者は被害者のブラウザでリクエストを偽造して送信できますどこでも。ランダムトークンを含まないリクエストを作成している3 XSRFエクスプロイト を次に示します。

サイトにランダムトークンが含まれている場合は、XSSを使用して、同一生成元ポリシーが提供する保護をバイパスする必要があります。 XSSを使用すると、JavaScriptを強制的に別のドメインから「発信」し、XmlHttpRequestを使用してトークンを読み取り、リクエストを偽造することができます。これが exploit 私が書いたものです。

12
rook

アナロジーで説明されたCSRF-例:

キー(キー)を使用して玄関のドアを開けていると想像してみてください。他の誰もあなたの鍵を持っていません。あなたはドアを開けますが、中に入る前に、隣人が道路の向こう側からあなたに電話をかけ、あなたは天気やトランプ大統領の最新の午前3時45分のツイートなどについて非常に友好的な会話をしています。この会話をしている間、知らないうちにあなた、他の誰かがあなたを外で見て、あなたと同じ服と髪型を着てあなたになりすますことを決心し、あなたになりすましてあなた自身の家に入ることに決めます!

あなたの家の中の誰も、何か違うことに気づいていません-あなたの妻は、「おやおや*、彼は家です」のようなものです。

なりすましはあなたのお金のすべてに自分自身を助け、おそらく途中でいくつかのXboxをプレイし、誰も賢い人はいないでしょう。

CSRFは基本的に、あなたが家のドアを開けてから開いたままにしておくという事実に依存しており、他の誰かが単に入ってあなたのふりをすることができます。

この問題を解決する方法は何ですか?

あなたが最初にあなたの家のドアを開けたとき、あなたはあなたのドアマンによってそれに書かれた長くて非常にランダムな番号が書かれた紙を与えられます:

「ASDFLJWERLI2343234」

さて、あなたが自分の家に入りたいのなら、あなたは入るためにドアの男にその一枚の紙を提示しなければなりません。

だからなりすましがあなたの家に入ろうとすると、ドアの男は尋ねます:

「紙に書かれている乱数は何ですか?」

偽装者が正しい番号を持っていない場合、彼は入りません。それか、乱数を正しく推測する必要があります。これは非常に難しい作業です。さらに悪いことに、乱数は20分間しか有効ではありません(例:)。したがって、なりすまし者は正しく推測する必要があり、それだけでなく、正しい答えを得るのに20分しかありません。それはあまりにも多くの努力です!それで彼はあきらめます。

確かに、アナロジーは少し緊張していますが、それがあなたのお役に立てば幸いです。

** crud =(作成、読み取り、更新された削除)

8
BKSpurgeon

トークンをすべてのURLにクエリ文字列として追加する以外の方法はありますか?非常に醜くて実用的ではないようで、ユーザーにとってブックマークが難しくなります。

サイトのすべてのURLにトークンを追加する理由はありません限りサイトのすべてのGETリクエストが読み取り専用であることを確認します。 GETリクエストを使用してサーバー上のデータを変更する場合は、CSRFトークンを使用してデータを保護する必要があります。

CSRFの面白い部分は、攻撃者がサイトにhttpリクエストを送信することはできても、応答を読み戻すことができないことです。

ランダムトークンのないGETURLがある場合、攻撃者はリクエストを行うことはできますが、レスポンスを読み戻すことはできません。そのURLがサーバー上の状態を変更した場合、攻撃者の仕事は完了です。しかし、HTMLを生成したばかりの場合、攻撃者は何も得られず、あなたは何も失いません。

7