\r\n\r\n
クロスサイトリクエストフォージェリ(CSRF)は、ウェブサイトの脆弱性を悪用する最も古い手法の一つです。通常、ログインなどの認証を必要とするサーバーサイドのWebスイッチを対象としています。CSRF攻撃では、攻撃者の目的は、被害者に代わって未承認の悪意のあるウェブリクエストを行わせることです。
CSRF攻撃を成功させる一般的な原因として、ウェブサイトのセキュリティ対策が弱い、あるいは不十分であることや、ユーザーパスにおける過失が挙げられます。
CSRF攻撃とは何か、そしてそれを阻止するために開発者やユーザーとしてどのようなアプローチが考えられるかを見ていきましょう。
CSRFとは、ユーザーのログインや認証が必要なWeb操作の際に、不正なリクエストを実行するために用いられる攻撃です。 CSRF攻撃は、セッションID、クッキー、その他のサーバーベースの脆弱性を悪用して、ユーザーの認証情報を盗み出すことができます。
例えば、アンチCSRF処理を有効にすることで、ドメインをまたいだ悪意のあるやり取りを防ぐことができます。
この障壁が破られると、攻撃者はユーザーのブラウザが作成するクッキーからユーザーのセッションIDを素早く搾取し、脆弱なWebサイトにスクリプトマーカーを埋め込むことができるようになります。
また、IDを操作することで、攻撃者は訪問者を別のウェブページにリダイレクトしたり、メールなどのソーシャルエンジニアリングの手法でリンクを送り、被害者にマルウェアのダウンロードを促したりすることができます。
被害者がこのようなアクションを実行すると、ユーザーのサービスページにHTTPリクエストを送信し、攻撃者をサポートするために要求されたアクションを承認します。これは、疑うことを知らないユーザーにとって破壊的なものです。
CSRF攻撃が成功すると、特にパスワードやユーザー名の変更要求などのサーバーベースの操作時に、認証済みユーザーのアクセス情報を失う可能性があります。最悪の場合、攻撃者はセッション全体を乗っ取り、ユーザーの代わりにアクションを実行します。
CSRFは、オンライン資金取引の乗っ取りやユーザー名とパスワードの変更に使用され、ユーザーは影響を受けるサービスにアクセスできなくなりました。
CSRF攻撃は、主にユーザー認証を伴うWebアクションを標的とし、成功させるためには、被害者が意図しない行動を取ることが必要です。
CSRF攻撃では、GET、DELETE、PUTの各操作と、脆弱性のあるPOSTリクエストが攻撃者の主なターゲットになります。
これらの用語の意味を見てみましょう。
事実上、攻撃者は CSRF 攻撃をバックアップするためにセッションハイジャックを使用します。この組み合わせを使用する場合、攻撃者はハイジャックを使用して被害者のIPアドレスを変更することができます。
このIPアドレスの変更により、被害者は、攻撃者がCSRFによって作成した複製フォームまたは変更されたサーバーリクエストを送信する偽装リンクを持つ新しいウェブサイトにログオンします。
そして、疑うことを知らないユーザーは、このリダイレクトがサービスプロバイダーからのものだと思い、攻撃者のウェブページにあるリンクをクリックしてしまうのです。これを実行すると、ハッカーは自分たちが知らないフォームでロードするページを送信する。
安全でないeコマース・プラットフォームでオンライン決済をしようとすることを想像してください。プラットフォーム所有者は、GETリクエストを使用してお客様のトランザクションを処理します。GETクエリは、次のようになります。
https://websiteurl/pay?amount=$10&company=[company ABC's account]ハイジャッカーは、GETリクエストのパラメータを変更することで、簡単にお客様のトランザクションを盗むことができます。そのために必要なのは、あなたの名前と名前を変えること、もっと悪いのは、あなたが支払うつもりの金額を変えることです。そして、元のクエリを次のように適応させる。
https://websiteurl/pay?amount=$20000&company=[attacker's account]変更されたGETリクエストを指すリンクをクリックすると、不注意にも攻撃者のアカウントに転送されてしまうのです。
GETリクエストによるトランザクション処理は、悪い習慣であり、攻撃されやすいアクティビティを残すことになります。
しかし、多くの開発者は、WebトランザクションにPOSTリクエストを使用する方がより安全だと考えています。これは事実ですが、残念ながらPOSTリクエストもCSRF攻撃に対して脆弱です。
POSTリクエストの乗っ取りを成功させるために攻撃者が必要とするのは、あなたの現在のセッションID、複製された目に見えないフォーム、そして時にはソーシャルエンジニアリングだけです。
例えば、POSTリクエストフォームは以下のようなものです。
<form action="Company ABC's account" method="POST"><input type="text" name="name" placeholder="name"><br><input type="number" name="amount"><br><input type="submit" name="submit"></form>しかし、攻撃者は、新しいページを作成し、上記のフォームを次のように修正することで、お客様の認証情報を交換することができます。
<body onload="document.getElementById('payment-form').submit();"><form action="Attacker's account" id="payment-form" method="POST"><input type="text" hidden name="name" placeholder="name"><br><input type="number" hidden value=30000 name="amount"><br><input type="submit" hidden name="submit"></form></body>折りたたまれたフォームでは、攻撃者は金額フィールドの値を「30000」に設定し、受信者の口座番号を自分の口座番号に置き換え、ページロード時にフォームを送信し、さらにフォームフィールドをユーザーから隠します。
現在のセッションを乗っ取ると、あなたの取引ページは攻撃者のページにリダイレクトされ、あなたが最も訪問しやすいとわかっているリンクをクリックするように促されます。
このボタンをクリックすると、フォーム送信のコピーが読み込まれ、お客様の資金が攻撃者の口座に振り込まれます。つまり、「送信」などのボタンをクリックしなくても、次のページが読み込まれたときに、JavaScriptが自動的にこの動作を行うのです。
あるいは、攻撃者はHTMLを埋め込んだメールを作成し、リンクをクリックして同じようにページロード型のフォーム送信を実行するよう促すこともできます。
CSRF 攻撃を受けやすいもう一つのアクションは、PUT リクエストのような、ユーザー名やパスワードの変更です。攻撃者はあなたのリクエストフォームをコピーし、あなたの電子メールアドレスを自分のものに置き換えます。
そして、セッションを盗んだり、ページにリダイレクトさせたり、キャッチーなリンクをクリックするように促すメールを送ったりします。
そして、パスワードリセットのリンクをあなたではなく、ハッカーのメールアドレスに送信する**クロスワード**フォームを送信してください。これにより、ハッカーはあなたのパスワードを変更し、あなたのアカウントからログアウトすることができます。
CSRFを防ぐ最善の方法の一つは、サーバー上で状態変更を実行するためにセッションクッキーに依存するのではなく、頻繁に変更されるトークンを使用することです。
関連:デジタル・セキュリティとプライバシー保護に関する無料ガイド
最近のバックエンドフレームワークの多くは、CSRFに対するセキュリティを備えています。そのため、自分でCSRFを強化する技術的なことを避けたい場合は、アンチCSRFトークンが組み込まれたサーバーサイドフレームワークを使用すれば、簡単に解決できます。
アンチCSRFトークンを使用すると、サーバーベースのリクエストは、静的攻撃に対してより脆弱なセッションクッキーの代わりにランダムな文字列を生成します。このようにして、ハイジャッカーによって推測されるセッションから保護されます。
トランザクションを実行するウェブアプリケーションに二要素認証(2FA)システムを実装することでも、CSRFの可能性を低減することができます。
CSRFは、クロスサイトスクリプティング(XSS)により引き起こされることがあります。XSSは、ユーザーフィールド(コメントフォームなど)にスクリプトを注入することを含みます。これを防ぐには、ウェブサイトのすべてのユーザー・フォーム・フィールドで、HTMLの自動エスケープを有効にするのが最適です。このアクションは、フォームフィールドがHTML要素を解釈するのを防ぎます。
認証を伴うWebサービスの利用者であれば、CSRFによって攻撃者に認証情報やセッションを盗まれないようにする役割を果たすことができます。
資金移動を伴う活動には、信頼できるウェブサービスを使用するようにする。
これに加えて、セッションの漏洩からユーザーを守るために安全なウェブブラウザを使用し、検索データの漏洩を防ぐために安全な検索エンジンを使用する必要があります。
関連:あなたのデータを尊重する最高のプライベート検索エンジン
また、ユーザーとして、ウェブ経由での認証には、サードパーティーの認証ツール(googleauthenticatorなど)またはその代替品に依存することも可能です。
攻撃者によるセッションの乗っ取りを阻止することはできませんが、パスワードやログイン情報などをブラウザに保存しないようにすることで、これを防ぐことができます。
開発者は、Webアプリケーションの開発・展開時に、セキュリティの脆弱性がないか定期的にテストする必要があります。
しかし、他の脆弱性をブロックしようとする一方で、他の脆弱性を導入してしまうこともよくあることです。したがって、CSRFをブロックしようとする場合、他のセキュリティ・パラメータに違反しないように注意する必要があります。